2011-12-23 6 views
4

私は、次の2つの関数を定義したいと思います:動的な関数マッピング

void Map<T>(Func<T, string> mapper); 

T Call<T>(string value); 

地図は「通話」機能を使って呼び出されたときには、型Tの結果に文字列をオン機能を保存する必要がありますタイプTと文字列で、適切な関数を検索して呼び出すことができます。

私はマップがタイプDictionary<Type, Func<object, string>>の辞書に関数を格納していて、Callが適切な型にキャストできたと思っていましたが、それを動作させることができません。誰もこれを達成する方法を知っていますか?

答えて

5

Funcの最初の型引数は入力、第二の出力です:Func<in T, out TResult> - あなたはFunc<string, T>を必要としています。

(MSDN参照hereFunc<string, string>迷惑である公平なビットを使用する。)

その辞書内の各要素のために異なるだとしても、辞書型引数Tを使用することはできません。むしろFunc<T, TResult>のスーパークラスDelegateを使用してください。

これは動作するはずです:

Dictionary<Type, Delegate> dictionary = new Dictionary<Type, Delegate>(); 

    public void Map<T>(Func<string, T> mapper) 
    { 
     dictionary[typeof(T)] = mapper; 
    } 

    public T Call<T>(string value) 
    { 
     var func = dictionary[typeof(T)] as Func<string, T>; 
     return func.Invoke(value); 
    } 
0

あなたは(そこより良い方法でなければなりませんが、私は今それを見ることができない)試してみて、このような何かを行うことができます。

Dictinary<Type, object> _funcDict = ...; 

void Map<T>(Func<T, string>mapper) 
{ 
    _funcDict[typeof(T)] = mapper; 
} 

T Call<T>(string value) 
{ 
    var func = (Func<T, string>)_funcDict[typeof(T)] 
    return func(value); 
} 

が、私は好きではない何か、オブジェクト値をしています辞書に入力してください、しかし、私はあなたがそれを避ける方法がわかりません。

+0

が動作しない、それは 'のFunc 'でなければなりません。私の答えを見てください。 –