我不得不实施一些问题的答案在这里,因为我试图从不同的组件实例化对象有些困难(但在相同的解决方案)。所以我想我会发布我发现的工作。
首先,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();
为什么你需要一个字符串实例化类?根据你的情况,可能会有“更清洁”的解决方案,特别是如果你不愿意使用反射。 – 2010-02-11 21:28:04
@SylvestreEquy但是也许在别人的情况下,这只是解决方案...... SO上的问题不仅仅为那些问他们的人提供服务。 – 2014-11-12 17:42:06