2011-12-23 110 views
4

我想定義以下兩個功能:動態函數映射

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

T Call<T>(string value); 

地圖需要存儲變成一個字符串轉換爲類型T的結果功能,這樣,當「呼叫」功能調用一個類型T和一個字符串,可以查找和調用相應的函數。

我在想,地圖可以將函數存儲在類型Dictionary<Type, Func<object, string>>類型的字典中,然後調用可以執行轉換爲適當的類型,但我無法讓它工作。有誰知道如何做到這一點?

回答

5

Func第一類參數是輸入,第二輸出:Func<in T, out TResult> - 所以你需要Func<string, T>

(該MSDN參考here使用Func<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鍵'。看到我的答案。 – 2011-12-23 07:52:58