2013-06-20 86 views
3

如何創建一個字典來存儲作爲值的繼承另一個類的類型?如何創建字典以存儲子類的類型

例如:

Dictionary<String, typeof(Parent)> dict = new Dictionary<string, typeof(Parent)>(); 
dict["key1"] = typeof(Child1); 
dict["key2"] = typeof(Child2); 
dict["key3"] = typeof(Child3); 

public abstract class Parent { } 

public class Child1 : Parent { } 
public class Child2 : Parent { } 
public class Child3 : Parent { } 

我不想存儲實例,但類類型。

編輯:對不起,我對我確切想要做的壞解釋。我正在尋找一種方法來存儲類型,並確保此類型繼承父。我想要保證類型安全,並確保商店類型是Parent的子代。唯一的方法,現在,我想如何做到這一點是創建我自己的IDictionary的實現爲here。但那不是我想要的。我想這樣做

Dictionary<string, typeof(Parent)> dict = ... 

有什麼想法嗎?

+0

你想'typeof'在'字典[ 「鍵1」] = typeof運算(Child1);'如果你需要在運行時通過'instance.GetType()'' – asawyer

+0

'獲得相同值的實例。同樣值得注意的是,類型字典通常是IoC容器的開始。如果您發現自己希望獲得對象生命週期管理功能,則可能需要查看Autofac或Ninject。 – neontapir

回答

6

我想你只是想用Dictionary<string, Type>然後當你添加你應該做的事情;

dict.Add("key1", typeof(Child1)); 

編輯:由於在阿維的回答指出,你可以使用一個實例GetType()方法,如果你想在運行時添加一個類型。如果你在編譯期間這樣做,你通常會在課上使用typeof

+0

這將工作,但是,我怎樣才能確保增值是父母的孩子?我想成爲類型安全的。 – Jeep87c

+0

@ Jeep87c你不能用一個簡單的語句來完成。您可以創建一個包裝類,因爲在類級別指定了泛型類型約束。例如;如果你正在實現一個通用的集合,你可以做'public class MyGenericList where T:Parent'。或者您可以添加一個擴展方法,在調用add之前強制實施類型約束。 – evanmcdonnal

+0

這就是我雖然...謝謝你的答案我會通過使用包裝的潛在解決方案。 – Jeep87c

0
var dict = new Dictionary<String, Type>; 
dict["key1"] = typeof(Child1); 
1

要解決你的問題,你需要通過System.Reflection檢查,如果你的類型從Parent類繼承。查看此答案以獲取更多信息(link)。

if (typeof(Parent).IsAssignableFrom(typeof(Child1))) 
{ 
    dict["key1"] = typeof(Child1); 
} 

或這一個(link

int n = 0; 
Type[] types = Assembly.GetExecutingAssembly().GetTypes(); 
foreach (Type type in types) 
{ 
    if (type.IsSubclassOf(typeof(Parent))) 
    { 
     dict["key" + n] = type; 
     n++; 
    } 
} 

編輯:

提供替代解決方案...

var result = System.Reflection.Assembly.GetExecutingAssembly() 
      .GetTypes() 
      .Where(t => t.IsSubclassOf(typeof(Parent)); 

foreach(Type type in result) 
{ 
    dict["key" + n] = type; 
    n++; 
} 

我認爲沒有 '直接'解決這個問題。

+0

我覺得這真的很接近我想要的。有沒有辦法避免if和/或foreach語句?例如,如果有人嘗試這樣做,可以拋出一個豁免dict [「key1」] = typeof(SomethingElse); SomethingElse不是父類的孩子。 – Jeep87c

2

使用的typeof:

dict["key1"] = typeof(Child1); 

,或者如果你有一個實例:

dict["key1"] = instance.GetType();