Предполагая, что ваш вызывающий поток / процесс имеет уникальный идентификатор (например, 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, были обработаны.
Нет, Вы не можете. C# не реализует утка, вводящая .
необходимо реализовать интерфейс и бросить к нему.
(Однако существуют попытки сделать это. Взгляд Утка, Вводящая Проект для примера.)
Можно использовать эти , Преобразовывают. Метод ChangeType .
object foo = GetFoo();
Type t = typeof(string);
string bar = (string)Convert.ChangeType(foo, t);
Ваш исходный вопрос был испорчен в этом, Вы просите рассматривать переменную как тип, который не известен во время компиляции, но обратите внимание, что у Вас есть строка, определенная на левой стороне, когда Вы объявляете свою переменную. 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);