Как генерировать экземпляр неизвестного типа во времени выполнения?

SELECT @@Scope_Identity as Id

существует также @@ идентификационные данные, но если у Вас будет триггер, они возвратят результаты чего-то, что произошло во время триггера, где scope_identity уважает Ваш объем.

12
задан abatishchev 17 June 2012 в 08:57
поделиться

7 ответов

Вы об этом думаете?

object result = Convert.ChangeType("4", Type.GetType("System.Int32"));
20
ответ дан 2 December 2019 в 03:38
поделиться

После использования:

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);
    }
}

Надеюсь, это поможет.

0
ответ дан 2 December 2019 в 03:38
поделиться

Как уже говорилось, это слишком широко и не может быть решено в целом.

Вот несколько вариантов:

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» ) показывает, насколько абсурдна общая проблема. Есть некоторые конструкции / преобразования, которые просто невозможно сделать.

Возможно, вы захотите переосмыслить проблему, которую вы пытаетесь решить, чтобы избежать этого болота.

16
ответ дан 2 December 2019 в 03:38
поделиться

Создание экземпляра типа, который вы знаете по имени (и который должен иметь конструктор по умолчанию):

   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);
    
3
ответ дан 2 December 2019 в 03:38
поделиться

Ваша логика кажется здесь немного ошибочной. Очевидно, что если вы позднее напрямую преобразуете объект в реальный тип, то вы должны знать тип для начала.

Если в этом вопросе чего-то еще не хватает, пожалуйста, уточните, и, возможно, есть более подходящий ответ, чем просто «В этом нет особого смысла».

1
ответ дан 2 December 2019 в 03:38
поделиться

Возможно, у вас есть набор различных типов, каждый из которых реализует известный интерфейс?

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

В этом случае вам понадобится использовать отражение для загрузки фактического типа из чего-то вроде полного имени сборки, а затем преобразовать его в свой известный тип, чтобы использовать его.

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

1
ответ дан 2 December 2019 в 03:38
поделиться

Это похоже на задание для Int32.Parse (string). Но чтобы согласиться с остальными, это кажется "уникальным" и, вероятно, следует подумать о перчатках.

0
ответ дан 2 December 2019 в 03:38
поделиться
Другие вопросы по тегам:

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