如何将由Activator.CreateInstance返回的对象转换为它转换的类型?
在下面的代码中,是否有可能将x转换为您要传递到Activator.CreateInstance
的类型,而无需知道它会提前?我尝试通过typeof...
但这并不起作用。如何将由Activator.CreateInstance返回的对象转换为它转换的类型?
var testClasses = AppDomain.CurrentDomain.GetAssemblies()
.Single(a=>a.FullName.StartsWith("VerifyStuff")).GetTypes()
.Where(t=>t.UnderlyingSystemType.Name.StartsWith("VerifyXXX"));
var x = Activator.CreateInstance(testClasses.ElementAt(0));
谢谢!
您只需将它转换:
MyObject x = (MyObject) Activator.CreateInstance(testClasses.ElementAt(0));
当然,这是怎么回事,如果你在testClasses
有一个类型的整个范围更加困难。如果它们都来自相同的基类或实现相同的接口,那么你可以转换到该基类或接口。
编辑:
是有可能x到你传递到Activator.CreateInstance类型转换不知道它是超前的时间是什么?
只是为了多一点解释:X 是你要CreateInstance
通过型式的,但其铸造成一个对象,因为具有的CreateInstance不知道你可以扔掉它。在创建具体实例后发生问题 - 您无法将其传递到另一个(强类型)函数,因为它将其作为object
。有一对夫妇的方式解决此问题:
正如我上面提到的,让他们都来自同一个基类或接口派生,这样就可以通过他们周围的基类或接口类型
-
,如果你有需要执行这些具体事例的动作的作用,创建一个通用的函数来做到这一点:
public T MyFunc(T myConcreteInstance) { ... do whatever it is i need to do... }
-
这是丑陋的,但它可能是难以避免...使用大如果。如果的.else声明对他们在操作之前确定它们的类型(提示:为了避免这种使用选项#1以上...):
Type t = myConcreteInstance.GetType(); if (t == typeof(someType1)) { } else if (t == typeof(someType2)) { } ... etc ...
如果此时你在想“为什么不我只是做一个通用版本的CreateInstance()?“然后不要打扰 - 已经有一个,它仍然不能解决你的问题之前强制类型的东西传递给他们。引用MSDN:
通常,在应用程序代码中CreateInstance没有用处,因为在编译时必须知道该类型。如果类型在编译时已知,则可以使用正常的实例化语法(C#中的新操作符,Visual Basic中的新操作符,C++中的gcnew)。
如果你要使用的CreateInstance,那是因为你不知道类型的时间提前,因此必须解决它。
感谢您的回复。我知道你可以打开对象并获得类型,我只是想在对象中传递一些通用的方法并获取实际的类型对象。可能不会。 – user259286 2011-04-22 01:31:20
@BrokenGlass - 我已经扩展了我的答案。 – slugster 2011-04-22 02:37:12
明白了!感谢那! – user259286 2011-04-22 02:48:05