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