У меня были некоторые трудности, реализующий некоторые из ответов здесь, потому что я пытался создать экземпляр объекта из другой сборки (но в том же растворе). Поэтому я думал, что опубликую то, что нашел на работе.
Во-первых, метод Activator.CreateInstance
имеет несколько перегрузок. Если вы просто вызываете Activator.CreateInstance(Type.GetType("MyObj"))
, это предполагает, что объект определен в текущей сборке, и он возвращает MyObj
.
Если вы ответите так, как указано в ответах здесь: Activator.CreateInstance(string AssemblyName, string FullyQualifiedObjectName)
, то вместо этого он возвращает ObjectHandle
, и вам нужно позвонить Unwrap()
, чтобы получить ваш объект. Эта перегрузка полезна при попытке вызова метода, определенного в другой сборке (BTW, вы можете использовать эту перегрузку в текущей сборке, просто оставьте параметр AssemblyName
null).
Теперь я нашел, что предложение, приведенное выше, чтобы использовать typeof(ParentNamespace.ChildNamespace.MyObject).AssemblyQualifiedName
для AssemblyName
, фактически дало мне ошибки, и я не мог заставить это работать. Я бы получил System.IO.FileLoadException
(не удалось загрузить файл или сборку ...).
Что я приступить к работе заключается в следующем:
var container = Activator.CreateInstance(@"AssemblyName",@"ParentNamespace.ChildNamespace.MyObject");
MyObject obj = (MyObject)container.Unwrap();
obj.DoStuff();
Почему вам нужно создать экземпляр вашего класса с помощью строки? В зависимости от вашего случая могут быть «более чистые» решения, особенно если вы не отказываетесь от использования рефлексии. –
@SylvestreEquy, но, возможно, в чьих-то проблемах, это просто решение ... Вопросы на SO не только обслуживают тех, кто их спрашивает. –