Возможно бросить переменную к типу, сохраненному в другой переменной?

Предполагая, что ваш вызывающий поток / процесс имеет уникальный идентификатор (например, thread_id), я думаю, что жизнеспособным подходом было бы добавить в вашу таблицу флаг (скажем, «handlerid»), который имеет значение null для вставки и то выполните:

update db set handlerid = <my_thread_id> where handlerid is null;
select * from db where handlerid is not null and handlerid = <my_thread_id>;
delete from db where handlerid is not null and handlerid = <my_thread_id>;

Не знаете, как это будет выполняться по сравнению с транзакцией, но не может думать о какой-либо причине, что было бы намного хуже (может быть, даже лучше), и используя этот подход, код кажется так же просто, как вы можете получить. в отличие от транзакции, вам не понадобится цикл в случае сбоя транзакции, чтобы быть уверенным, что все незавершенные элементы, которые были в таблице во время последнего SELECT, были обработаны.

18
задан Marek Grzenkowicz 21 January 2009 в 12:57
поделиться

3 ответа

Нет, Вы не можете. C# не реализует утка, вводящая .

необходимо реализовать интерфейс и бросить к нему.

(Однако существуют попытки сделать это. Взгляд Утка, Вводящая Проект для примера.)

14
ответ дан 30 November 2019 в 07:04
поделиться

Можно использовать эти , Преобразовывают. Метод ChangeType .

object foo = GetFoo(); 
Type t = typeof(string);
string bar = (string)Convert.ChangeType(foo, t);
20
ответ дан 30 November 2019 в 07:04
поделиться

Ваш исходный вопрос был испорчен в этом, Вы просите рассматривать переменную как тип, который не известен во время компиляции, но обратите внимание, что у Вас есть строка, определенная на левой стороне, когда Вы объявляете свою переменную. C# с 3,5 со статическим контролем типов.

Однажды динамичный доступно, Вы могли сделать что-то вроде этого:

dynamic foo = GetFoo();
foo.FunctionThatExistsInBarType(); 

Для того, когда Вы не знаете то, что тип всего лишь, Вы знаете, что он будет всегда поддерживать метод экземпляра FunctionThatExistsInBarType ();

на данный момент Вы вынуждены использовать отражение (или кодировать генерала, который действительно означает почти такую же вещь, но более дорогой честный и быстрее позже).

// any of these can be determined at runtime
Type t = typeof(Bar);
string methodToCall = "FunctionThatExistsInBarType";
Type[] argumentTypes = new Type[0];
object[] arguments = new object[0];
object foo;
// invoke the method - 
// example ignores overloading and exception handling for brevity
// assumption: return type is void or you don't care about it
t.GetMethod(methodToCall, BindingFalgs.Public | BindingFlags.Instance)
    .Invoke(foo, arguments);
4
ответ дан 30 November 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: