簡體   English   中英

C#中的后期綁定

[英]Late binding in 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;
}

你看過Activator.CreateInstance(默認)嗎? 您將無法完全消除創建代碼,您仍然很可能必須處理原語,但您應該能夠簡化許多其他情況。

我經常為這些問題創建一個Dictionary<Type, Func<...>>

您可以使用C#4.0的動態功能

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

我只是失明了。 是否有一些情況下調用重載的私有方法_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似乎也可能與所涉及的類型相關聯,但我無法從你發布的代碼中得知。 我希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM