[英]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.