2011-11-23 62 views
4

以下問題及答案解決了使用out參數的委託:如何使用C#委託調用每個具有不同out參數的不同方法?

Func<T> with out parameter

我需要這一步。我有幾個轉換方法(函數),我想在這裏使用委託。例如,讓我們先從下面的示例方法:

private bool ConvertToInt(string s, out int value) 
{ 
    try 
    { 
     value = Int32.Parse(s); 
     return true; 
    } 
    catch (Exception ex) 
    { 
     // log error 
     value = 0; 
    } 

    return false; 
} 


private bool ConvertToBool(string s, out bool value) 
{ 
    try 
    { 
     value = Convert.ToBoolean(s); 
     return true; 
    } 
    catch (Exception ex) 
    { 
     // log error 
     value = false; 
    } 

    return false; 
} 

我隨後宣佈以下委託:

delegate V ConvertFunc<T, U, V>(T input, out U output); 

我想什麼做的是這樣的(僞代碼):

if (do int conversion) 
    func = ConvertToInt; 
else if (do boolean conversion) 
    func = ConvertToBool; 
else ... 

編譯器只允許我明確聲明委託標識符如下:

ConvertFunc<string, int, bool> func1 = ConvertToInt; 
ConvertFunc<string, bool, bool> func2 = ConvertToBool; 

我該如何聲明一個標識符,我可以根據上述模式(根據我希望執行的轉換類型)分配多種方法中的任何一種?

更新:

假設含有的串/對象值對的字典:

private Dictionary<string, object> dict = new Dictionary<string, object>(); 

隨着值,如:

this.dict.Add("num", 1); 
this.dict.Add("bool", true); 

基於答案,我能夠實施我的代表如下:

public T GetProperty<T>(string key) 
{ 
    ConvertFunc<string, T, bool> func = ConvertToT<T>; 
    object val = this.dict[key]; 
    T result; 
    if (func(key, out result)) 
     return result; 
    else 
     return default(T); 
} 
+3

很難建議您如何繼續運行,沒有看到該方法的其餘這將* *調用此委託。我懷疑你會發現,當你試圖將僞代碼變成真正的代碼時,編譯器錯誤背後的原因變得更加清晰。 –

回答

6

我認爲你正在尋找的東西像

private bool ConvertToT<T>(string s, out T value) 
{ 
    try 
    { 
     value = (T)Convert.ChangeType(s, typeof(T)); 

     return true; 
    } 
    catch (Exception ex) 
    { 
     // log error // not sure what you're trying here? 
     value = default(T); 
    } 
    return false; 
} 
+0

不錯!這就像一個魅力。 – Elan

相關問題