2009-04-30 3 views
2

辞書オブジェクトをメンバフィールドとして作成する必要があります。
key = string
value = Action<T>のインスタンスです。ここで、Tはエントリごとに異なる場合があります。 int、string(ValueTypeまたはRefType)値を持つディクショナリをアクション<T>のインスタンスとして作成する構文は何ですか?

コンパイラを私に同意させることはできません。メンバーフィールドを作成するには、固定T仕様が必要です。私は「これは難しいことではない」という意識の前に、闘争の時間の限界を過ぎました。

ジェネリックnoobの間違いかもしれません。使用法は基本的に、あなたがすることはできません。この

m_Map.Add("Key1", 
    new delegate(long l) {Console.Writeline("Woohoo !{0}", l.ToString();)); 
+0

(改訂)ボクシングはあなたが考えるほど悪くはありません。特に、ボクシングはダイナミックな呼び出しよりもはるかに*高速です。 –

答えて

2

ようなものになるだろう。..

を啓発してください。コンパイラはどのようなタイプのエントリを特定のエントリに興味があるのか​​をどのように知っていますか?

Dictionary<Type, Action<T>>の関係を説明することもできません。各辞書エントリには、タイプであるキーとそのタイプを使用するアクションがあります。ジェネリックスはその関係をサポートしていません。

の場合は、使用しようとする種類を知っている場合は、Dictionary<string, Delegate>にして、値をキャストしてキャストしてください。または、Action<object>を使用してボクシングと一緒に暮らし、キャストすることができます。ただDelegateと匿名メソッドやラムダ式を使用するように、あなたはキャストする必要があります

注 - または便利な変換方法を記述します。

public static Delegate ConvertAction<T>(Action<T> action) 
{ 
    return action; 
} 

あなたが書くことができますこの方法:

Delegate dlg = ConvertAction((long x) => Console.WriteLine("Got {0}", x)); 

または辞書の文脈で:

var dict = new Dictionary<string, Delegate>(); 
dict["Key1"] = ConvertAction((long x) => Console.WriteLine("Got {0}", x)); 

あなたは再びかかわらず、辞書のうちの値をフェッチするときedは

代わりに直接辞書をさらすこと、あなたが辞書をカプセル化することができ...

異なるタック...右の型にキャストしますあなた自身のタイプ、およびジェネリックAdd方法があります。

public void Add<T>(string key, Action<T> action) 

だから、まだ舞台裏Dictionary<string, Delegate>だろうが、あなたのタイプは、それが唯一の単一の引数を取る代表団だった値が含まれていることを確認しますが。

+0

しかし、コンパイルエラーが発生しました:「匿名メソッドを代理人に入力できません」... – Gishu

+0

私があなたがコメントしている間に私が書いていた編集を見てください:) –

+0

ここで執行しようとしている唯一のことは、値が1つのパラメータを取る方法でなければならないということです。 – Gishu

1

入り口ごとに異なるTの場合は、おそらくAction<object>で標準化し、実際の動作にキャストしますか?

static void Main() { 
     var m_Map = new Dictionary<string, Action<object>>(); 
     m_Map.Add("Key1", obj => Console.WriteLine("Woohoo !{0}", obj)); 
     m_Map.Add("Key2", obj => SomeMethod((int)obj)); 

     m_Map["Key1"](123); 
     m_Map["Key2"](123); 
    } 
    static void SomeMethod(int i) { 
     Console.WriteLine("SomeMethod: {0}", i); 
    } 
+0

とbox-unboxこれらの一般的な時代の私の価値のタイプ.. Sacrilege! :)私は私がこれを働かせるために苦労していた間、私の弱い瞬間の一つでそれを考えると告白する必要があります。 – Gishu

+0

+1ベンチマークのために: [.03秒。 GCコレクション= 3のためのアクション.Invoke] [2.81秒。 GC Collections = Delegate.DynamicInvokeの場合は70です.03秒。 GCコレクション= 0、アクション.Invoke] アクションはアクションと同じ速さで実行されますが、明らかにより多くのボックスとコードのキャストにつながっています。私が必要としているもののスニペットは、私のrespにhttp://stackoverflow.com/questions/805505/c-marking-class-property-as-dirty/に掲載されています。 – Gishu

関連する問題