2011-03-12 52 views
0

我想消除以下代碼片段中的類型測試。
有沒有人有任何想法我可以做到這一點?
C#中的後期綁定#

 
public override T Value { 
get { 
// I want to use late binding here so that the following call is made: 
// bOK = _FolderParmT(ref _value, strFParamVal)); 
// Let the compiler figure out at runtime which func to call based T's type. 
// Until I do that I'll have to parse the type. 
// Be sure to update the constructor if you add a new type 
T TVal = _value; 
if (_value is string) { 
    string v = null; 
    bOK = _FolderParmT(ref v, strFParamVal); 
    if (bOK) TVal = ((T)((object)(v))); 
} else if (_value is System.String[]) { 
    string[] v = null; 
    bOK = _FolderParmT(ref v, strFParamVal); 
    if (bOK) TVal = ((T)((object)(v))); 
} else if (_value is double) { 
    double v = double.MinValue; 
    bOK = _FolderParmT(ref v, strFParamVal); 
    if (bOK) TVal = ((T)((object)(v))); 
} else if (_value is int) { 
    int v = int.MinValue; 
    bOK = _FolderParmT(ref v, strFParamVal); 
    if (bOK) TVal = ((T)((object)(v))); 
} else if (_value is long) { 
    long v = long.MinValue; 
    bOK = _FolderParmT(ref v, strFParamVal); 
    if (bOK) TVal = ((T)((object)(v))); 
} else if (_value is bool) { 
    bool v = false; 
    bOK = _FolderParmT(ref v, strFParamVal); 
    if (bOK) TVal = ((T)((object)(v))); 
} 

if (bOK) { 
    base.SendMessage("\"" + _strFolderParameter + "\" setting: \"" + strFParamVal +"\" was used"); 
    return TVal; 
} 
+0

你的問題/目標是什麼?性能?易於維護?您的目標與選擇合適的解決方案相關。 – dvdvorle 2011-03-12 22:03:23

回答

0

你可以使用C#4.0

((dynamic)this)._FolderParmT(ref _value, strFParamVal)); 
+0

就是這個!我很久之後再次加入C#。謝謝你的幫助。它會使代碼看起來更乾淨。加上現在我知道一個簡單的方法來做後期綁定。 – 2011-03-13 09:19:37

+0

請考慮標記爲已回答。 – Jeff 2011-03-13 10:44:06

1

動態特徵我通常創建爲這些類型的問題Dictionary<Type, Func<...>>

0

我剛剛失明。是否有某些情況下調用重載的私有方法_FolderParmT無法正常工作?從這個例子中,我不知道泛型類爲什麼涉及嗅探類型。鑑於你的問題,我將消除與類型檢查:

public class Test<T> 
{ 
    private string _something; 
    private T _value; 
    public T Prop 
    { 

     get 
     { 
      T horridRef = default(T); 
      return _FolderParmT(ref horridRef, _something) ? horridRef : default(T); 
     } 
     set { _value = value; } 
    } 

    private bool _FolderParmT(ref T horridRef, string something) 
    { 
     return true; 
    } 
} 

我相信我們有後期綁定是什麼有點分歧。其他涉及反思的答案確實允許後期綁定,但是直到有人可以糾正我,我認爲你的版本根本不具備後期綁定的功能。

我也會消除該ref參數,只是返回值,以便您可以輕鬆地進行模擬/測試。 _FolderParmT似乎也可能有點類似於所涉及的類型,但我無法從您發佈的代碼中完全知道。我希望這有幫助。