use*_*286 1 types object instance
在下面的代码中,是否可以将x转换为您传入的类型Activator.CreateInstance而不知道它是什么时候提前?我尝试过,typeof...但这不起作用.
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));
Run Code Online (Sandbox Code Playgroud)
谢谢!
你只需要施放它:
MyObject x = (MyObject) Activator.CreateInstance(testClasses.ElementAt(0));
Run Code Online (Sandbox Code Playgroud)
当然,如果你有各种类型的话,这将会更加困难testClasses.如果它们都是从相同的基类派生或实现相同的接口,那么您可以转换为该基类或接口.
是否有可能将x转换为您传递给Activator.CreateInstance的类型而不知道它提前是什么?
只是为了更加一些解释:x 是你传入的类型CreateInstance,但是它被转换为一个对象,因为CreateInstance不知道你可能会抛出什么.您在创建具体实例后出现问题 - 您无法将其传递给另一个(强类型)函数,因为您将其作为一个object.有几种方法可以解决这个问题:
如上所述,让它们都来自相同的基类或接口,以便您可以将它们作为基类或接口类型传递
如果您有一个需要对这些具体实例执行操作的函数,请创建一个通用函数来执行此操作:
public T MyFunc(T myConcreteInstance)
{
... do whatever it is i need to do...
}
Run Code Online (Sandbox Code Playgroud)这很难看,但可能很难避免... 在操作它们之前使用一个大的if..else if语句来确定它们的类型(提示:避免使用上面的选项#1 ......):
Type t = myConcreteInstance.GetType();
if (t == typeof(someType1))
{
}
else if (t == typeof(someType2))
{
}
... etc ...
Run Code Online (Sandbox Code Playgroud)如果此时您正在考虑"我为什么不制作CreateInstance()的通用版本?" 然后不要打扰 - 已经有一个,它仍然无法解决你在传递它们之前强烈键入的问题.引用MSDN:
通常,应用程序代码中的CreateInstance没有用处,因为必须在编译时知道该类型.如果在编译时已知类型,则可以使用正常的实例化语法(C#中的new运算符,Visual Basic中的New,C++中的gcnew).
如果您打算使用CreateInstance,那是因为您不提前知道类型,因此您必须解决它.