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 { }

インスタンスではなくクラスタイプを保存したい。

編集:私が正確にやりたいことについての私の悪い説明で申し訳ありません。Type を格納し、この Type が Parent を継承していることを確認する方法を探しています。タイプ セーフになり、ストア タイプが Parent の子であることを確認します。今のところ、これを行う唯一の方法は、 hereのように IDictionary の独自の実装を作成することです。しかし、それはまさに私が欲しいものではありません。私はこれをしたいです

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

何か案が?

4

4 に答える 4

7

Dictionary<string, Type>やるべきことを追加するときに使用したいだけだと思います。

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

編集: Avi の回答に記載されてGetType()いるように、実行時にタイプを追加する場合は、インスタンスでメソッドを使用できます。コンパイル時に実行する場合は、通常typeof、クラスで使用します。

于 2013-06-20T17:27:59.967 に答える
2

使用タイプ:

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

またはインスタンスがある場合:

dict["key1"] = instance.GetType();
于 2013-06-20T17:30:10.317 に答える
1

問題を解決するには、タイプがクラスSystem.Reflectionから継承されているかどうかを確認する必要があります。Parent詳細については、この回答を確認してください (リンク)。

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

またはこれ(リンク

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++;
}

この問題に対する「直接的な」解決策はないと思います。

于 2013-06-20T17:28:14.833 に答える
0
var dict = new Dictionary<String, Type>;
dict["key1"] = typeof(Child1);
于 2013-06-20T17:28:06.257 に答える