如何将Activator.CreateInstance返回的对象转换为它转换的类型?

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)

谢谢!

slu*_*ter 7

你只需要施放它:

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,那是因为您不提前知道类型,因此您必须解决它.