2012-10-13 107 views
2
創建實例

假設我們有一些類使用催化劑

class Class1{ } 
class Class2{ } 
class Class3{ } 

,我有一個類型變量

Type t = /*some type unknown at compile-time*/; 

變量t爲1類或類2或Class3中。我想創建該類的一個實例。據我所知,我可以使用以下語句:

object instance = Activator.CreateInstance(t); 

但我收到一個對象。問題是:如何將此對象轉換爲變量t。或者有人可以建議一種解決方法。 感謝

回答

3

除非有一些共同的基類或接口,所有3股,你不能 - 你可以把它叫做是「對象」 。考慮讓他們全部實現一個接口,然後轉向它。

5

如果你想避免反射,然後

public interface IClass { } 
class Class1 : IClass { } 
class Class2 : IClass { } 
class Class3 : IClass { } 

IClass instance = (IClass)Activator.CreateInstance(t); 
2

您可以使用關鍵字dynamic

dynamic instance = Activator.CreateInstance(t); 

這就像如果你使用object,但在這種情況下,類型僅在運行時已知的,所以直到你沒有運行您的程序它支持一切。 處理反射是很常見的。

欲瞭解更多信息look here

1

has been told that you can't,然而,你可以。

首先,讓我們看看你的代碼:

class Class1{ } 
class Class2{ } 
class Class3{ } 

void Main() 
{ 
    Type t = /*some type unknown at compile-time*/; 
    object instance = Activator.CreateInstance(t); 
} 

而且你的問題:

我怎麼施放此對象類型,它是在變量t。

好吧,如果我只看這個信息,那麼答案是:你不能,因爲有一組無限的類型可能是變量t,事實上,他們中的一些可能已經在寫這段代碼之後定義(它們還沒有存在)。

好 - 因爲它似乎是 - 有一些其他的信息:

變量t是1類或類2或Class3的

這意味着你有一組可能的類型,可能在變量t

考慮到這一點你可以檢查它們,例如:

class Class1{ } 
class Class2{ } 
class Class3{ } 

void Main() 
{ 
    var possibleTypes = new Type[] 
    { 
     typeof(Class1), 
     typeof(Class2), 
     typeof(Class3) 
    }; 
    Type t = possibleTypes[(new Random()).Next(possibleTypes.Length)]; 
    object instance = Activator.CreateInstance(t); 
    if (t.Equals(typeof(Class1))) 
    { 
     DoSomethingWithClass1(instance as Class1); 
    } 
    else if (t.Equals(typeof(Class2))) 
    { 
     DoSomethingWithClass2(instance as Class2); 
    } 
    else if (t.Equals(typeof(Class3))) 
    { 
     DoSomethingWithClass3(instance as Class3); 
    } 
} 

void DoSomethingWithClass1(Class1 instance) 
{ 
    //... 
} 

void DoSomethingWithClass2(Class2 instance) 
{ 
    //... 
} 

void DoSomethingWithClass3(Class3 instance) 
{ 
    //... 
} 

那麼它的工作原理,以及裏面的每個可以使用不管它是什麼appropiate該類類的方法。

「這不是非常通用的」 - 你說 - 「我不想在每次新課程出現時寫一個新方法!」。我同意,你可以解決進入Reflection部門的問題。但是,老實說,這是毫無意義的。正如你已經被告知這些課程沒有共同之處,所以你最好是creating an interface to avoid Reflection

另外,你想用這個對象做什麼?有機會,你可以找到所有類通用的方法,並使用相關類從現在開始實現的新界面中的方法。好的,我知道在撰寫本文的時候已經有了一個可以接受的答案,但我仍想指出:是的,你可以。 (每次我找到有人說你不能做某事,我喜歡檢查:P)。

+0

謝謝你的回答。事實上,我有很多分類(30-50),所以在這一點上編寫開關盒對我來說不是一個好主意。通過創建一個公共基類來找到解決方案。 – steavy