SELECT @@Scope_Identity as Id
существует также @@ идентификационные данные, но если у Вас будет триггер, они возвратят результаты чего-то, что произошло во время триггера, где scope_identity уважает Ваш объем.
Вы об этом думаете?
object result = Convert.ChangeType("4", Type.GetType("System.Int32"));
После использования:
Type type = Type.GetType(typename);
Попробуйте это метод расширения:
public static class ReflectionExtensions
{
public static T CreateInstance<T>(this Type source, params object[] objects)
where T : class
{
var cons = source.GetConstructor(objects.Select(x => x.GetType()).ToArray());
return cons == null ? null : (T)cons.Invoke(objects);
}
}
Надеюсь, это поможет.
Как уже говорилось, это слишком широко и не может быть решено в целом.
Вот несколько вариантов:
Type type = Type.GetType(typename);
object o = Activator.CreateInstance(type);
Это создаст экземпляр типа, который typename
] описывает. Он вызывает конструктор этого типа без параметров. (Обратная сторона: не все объекты имеют конструктор без параметров. Кроме того, он устанавливает состояние объекта, используя значение
.)
Type type = Type.GetType(typename);
object o = Activator.CreateInstance(type, new[] { value });
Это создаст экземпляр типа, который typename
описывает. Он вызывает конструктор этого типа, который принимает один параметр типа string
. (Обратная сторона: не все объекты имеют такой конструктор. Например, Int32
не имеет такого конструктора, поэтому возникнет исключение во время выполнения.)
Type type = Type.GetType(typename);
object o = Convert.ChangeType(value, type);
Будет предпринята попытка преобразовать значение строки
к экземпляру требуемого типа. Однако это может привести к возникновению InvalidCastException
. Например, Convert.ChangeType ("4", typeof (FileStream))
, очевидно, завершится ошибкой, как и должно быть.
Фактически, этот последний пример (создание экземпляра типа FileStream
с начальным состоянием, определяемым строкой «4»
), показывает, насколько абсурдна общая проблема. Есть некоторые конструкции / преобразования, которые просто невозможно сделать.
Возможно, вы захотите переосмыслить проблему, которую вы пытаетесь решить, чтобы избежать этого болота.
этот последний пример (создание экземпляра типа FileStream
с его начальным состоянием, определяемым строкой «4»
) показывает, насколько абсурдна общая проблема. Есть некоторые конструкции / преобразования, которые просто невозможно сделать.
Возможно, вы захотите переосмыслить проблему, которую вы пытаетесь решить, чтобы избежать этого болота.
этот последний пример (создание экземпляра типа FileStream
с его начальным состоянием, определяемым строкой «4»
) показывает, насколько абсурдна общая проблема. Есть некоторые конструкции / преобразования, которые просто невозможно сделать.
Возможно, вы захотите переосмыслить проблему, которую вы пытаетесь решить, чтобы избежать этого болота.
Создание экземпляра типа, который вы знаете по имени (и который должен иметь конструктор по умолчанию):
string typeName = "System.Int32";
Type type = Type.GetType(type);
object o = Activator.CreateInstance(type);
Разбор значения из строки, очевидно, будет работать только для ограниченного набора типов. Вы можете
Convert.ChangeType
, как предлагается
от PhilipW Словарь <Тип, Функция <строка, объект >>
который отображает известные типы в известный синтаксический анализ
функции или используйте отражение, чтобы вызвать Parse (string) метод по типу, предполагая, что он есть:
string valueText = "4";
MethodInfo parseMethod = type.GetMethod ("Parse");
значение объекта = parseMethod.Invoke (null, новый объект [] {valueText});
или, может быть, вы можете использовать инфраструктура, предоставляемая .NET компонентная модель. Вы можете получить преобразователь типов компонента и использования это так:
TypeConverter converter = TypeDescriptor.GetConverter (тип);
значение объекта = преобразователь.ConvertFromString (valueText);
Ваша логика кажется здесь немного ошибочной. Очевидно, что если вы позднее напрямую преобразуете объект в реальный тип, то вы должны знать тип для начала.
Если в этом вопросе чего-то еще не хватает, пожалуйста, уточните, и, возможно, есть более подходящий ответ, чем просто «В этом нет особого смысла».
Возможно, у вас есть набор различных типов, каждый из которых реализует известный интерфейс?
Например, если у вас есть несколько различных пользовательских элементов управления и вы хотите загрузить один из их в контейнер, каждый из них может реализовать IMyWobblyControl (известный интерфейс), но вы можете не знать до времени выполнения, какой из них загружать, возможно, из чтения строк из некоторой формы файла конфигурации.
В этом случае вам понадобится использовать отражение для загрузки фактического типа из чего-то вроде полного имени сборки, а затем преобразовать его в свой известный тип, чтобы использовать его.
Конечно, вам нужно убедиться, что ваш код обрабатывает недопустимое приведение, сборка не найдена и любые другие исключения, которые могут возникнуть из-за чего-то такого шаткого, как это ...
Это похоже на задание для Int32.Parse (string). Но чтобы согласиться с остальными, это кажется "уникальным" и, вероятно, следует подумать о перчатках.