1

aを anにDictionaryマップするa を作成したいのですが、キーを特定の親クラスに由来する型にしたいと考えています。だから私は次のようなことをしたい:TypeAction

class Container
{
    private Dictionary<Type, Action> dict;

    public void AddAction(Type t, Action a) where t : typeof(SomeParentClass)
    {
        dict[t] = a;
    }
}

メソッドは、特定のクラスのサブクラスであるクラスのタイプであるAddAction値のみを受け入れます。tキーワードを使用してJavaでこのようなことが行われているのを見たことextendsがありますが、可能であればC#でこれを行う方法がわかりません。

編集:明確にするために、 AddAction メソッドが SomeParentClass のインスタンスを取得するのではなく、 SomeParentClass のサブクラスであるクラスの Type を取得したくありません。タイプを使用するよりも良い方法はありますか?

編集:私が本質的にやろうとしているのは、アプリのさまざまな部分がイベントタイプに関心を登録し、そのタイプのイベントが発生したときに呼び出されるアクションを提供できるディスパッチサービスを作成することです. だから、次のようなものを想像してください

service.RegisterInterest(typeof(MyEvent), myAction)

WheremyActionはタイプですAction<MyEvent>(元の投稿には入れなかったが、プレーンの代わりに持つべきものAction)。

次に、アプリの他の部分でできること

service.TriggerEvent(typeof(MyEvent))

これにより、上記のように登録されたすべてのAction<MyEvent>インスタンスが呼び出されます...実際には、単一の ではなく aにDictionaryマップされます。TypeList<Action<Event>>Action

4

4 に答える 4

6

コンパイル時のチェックが必要な場合は、ジェネリックを使用できます。

public void AddAction<T>(Action a) where T : SomeParentClass
{
    dict[typeof(T)] = a;
}

非汎用バージョンを保持することもできます

public void AddAction(Type t, Action a)
{
    if(! typeof(SomeClass).IsAssignableFrom(t)) throw new ArgumentException();
    dict[t] = a;
}
于 2012-06-28T19:52:12.753 に答える
2

私は次のようなもので行きます:

class Container
{
    private Dictionary<Type, Action> dict;

    public bool AddAction(Type t, Action a) 
    {
        if (typeof(SomeParentClass).IsAssignableFrom(t))
        { 
            dict[t] = a;
            return true;
        }
        return false;
    }
}
于 2012-06-28T19:53:02.953 に答える
0

の代わりに、パラメータとしてType t使用しますSomeParentClass t

于 2012-06-28T19:46:14.987 に答える
0

メソッドにアサーションを追加します。

Debug.Assert(t.IsAssignableFrom(typeof(SomeParentClass)));
于 2012-06-28T19:57:05.247 に答える