2011-04-22 80 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

相關問題