В качестве примера возьмем следующий класс:
class Sometype
{
int someValue;
public Sometype(int someValue)
{
this.someValue = someValue;
}
}
Затем я хочу создать экземпляр этого типа, используя отражение:
Type t = typeof(Sometype);
object o = Activator.CreateInstance(t);
Обычно это сработает, однако, поскольку SomeType
не определен конструктор без параметров, вызов вызывает Activator.CreateInstance
исключение типа MissingMethodException
с сообщением « Для этого объекта не определен конструктор без параметров ». Есть ли альтернативный способ по-прежнему создать экземпляр этого типа? Было бы отстойно добавлять конструкторы без параметров ко всем моим классам.
FormatterServices.GetUninitializedObject
не позволять создавать неинициализированную строку. Вы можете получить исключение:System.ArgumentException: Uninitialized Strings cannot be created.
помните об этом.Ответы:
Первоначально я разместил этот ответ здесь , но вот его перепечатка, поскольку это не тот же вопрос, но имеет тот же ответ:
FormatterServices.GetUninitializedObject()
создаст экземпляр без вызова конструктора. Я нашел этот класс, используя Reflector и покопавшись в некоторых основных классах сериализации .Net.Я протестировал его, используя приведенный ниже пример кода, и похоже, что он отлично работает:
источник
Используйте эту перегрузку метода CreateInstance:
См .: http://msdn.microsoft.com/en-us/library/wcxyzt4d.aspx
источник
Когда я тестировал производительность,
(T)FormatterServices.GetUninitializedObject(typeof(T))
он был медленнее. В то же время скомпилированные выражения дадут вам значительное увеличение скорости, хотя они работают только для типов с конструктором по умолчанию. Я использовал гибридный подход:Это означает, что выражение create эффективно кэшируется и влечет за собой штраф только при первой загрузке типа. Будет также эффективно обрабатывать типы значений.
Назови это:
Обратите внимание, что
(T)FormatterServices.GetUninitializedObject(t)
для строки не удастся. Следовательно, для возврата пустой строки применяется специальная обработка строки.источник
Хорошие ответы, но непригодные для использования на компактной платформе dot net. Вот решение, которое будет работать на CF.Net ...
источник