C#中的后期绑定

时间:2011-03-12 21:51:33

标签: c# binding

我想在以下代码段中消除类型测试。
有没有人知道我该怎么做?

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;
}

4 个答案:

答案 0 :(得分:1)

您是否看过Activator.CreateInstance(default)?您将无法完全消除创建代码,您仍然很可能必须处理原语,但您应该能够简化许多其他情况。

答案 1 :(得分:1)

我经常为这些问题创建一个Dictionary<Type, Func<...>>

答案 2 :(得分:0)

您可以使用C#4.0的动态功能

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

答案 3 :(得分: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似乎也可能与所涉及的类型相关联,但我无法从你发布的代码中得知。我希望这会有所帮助。