我想在以下代码段中消除类型测试。
有没有人知道我该怎么做?
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 :(得分: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似乎也可能与所涉及的类型相关联,但我无法从你发布的代码中得知。我希望这会有所帮助。