2011-04-22 78 views
1

在下面的代码中,是否有可能将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)); 

谢谢!

回答

7

您只需将它转换:

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,那是因为你不知道类型的时间提前,因此必须解决它。

+0

感谢您的回复。我知道你可以打开对象并获得类型,我只是想在对象中传递一些通用的方法并获取实际的类型对象。可能不会。 – user259286 2011-04-22 01:31:20

+0

@BrokenGlass - 我已经扩展了我的答案。 – slugster 2011-04-22 02:37:12

+0

明白了!感谢那! – user259286 2011-04-22 02:48:05

相关问题