我只是有以下情况
我想从方法返回字符串,但方法应该基于变量类型,即(Type CType
)
我需要像这样制作渲染类
public string render(TextBox ctype){
return "its text box";
}
public string render(DropDown ctype){
return "its drop down";
}
你知道TextBox是一个类型,这就是为什么我可以像这样声明Type变量
var CType = typeof(TextBox)
我需要像这样调用render方法
render(Ctype);
所以如果Ctype是TextBox的类型,它应该调用render(TextBox ctype) 等等 我该怎么做?
答案 0 :(得分:0)
你应该使用模板功能
public customRender<T>(T ctype)
{
if(ctype is TextBox){
//render textbox
}
else if(ctype is DropDown){
//render dropdown
}
}
希望它会有所帮助
答案 1 :(得分:0)
首先,即使您没有see
if
或switch
,某些功能中仍然会隐藏一个地方。如果没有控制流的任何这种分支,那么在运行时区分类型在编译时是不可能的。
您可以使用其中一个集合类在运行时构建映射,将Type
个实例映射到Func<T, TResult>
methods。例如,您可以使用Dictionary
类型创建此类地图:
var rendererFuncs = new Dictionary<Type, Func<object, string>>();
然后您可以像这样在该词典中添加一些条目:
rendererFuncs[typeof(TextBox)] = ctype => "its text box";
rendererFuncs[typeof(DropDown)] = ctype => "its drop down";
稍后,您可以调用相应的函数:
string renderedValue = rendererFuncs[Ctype.GetType()](Ctype);
或者,如果您希望安全起见(如果Ctype
值没有合适的渲染器):
string renderedValue;
Func<object, string> renderer;
if (rendererFuncs.TryGetValue(Ctype.GetType(), out renderer)) {
renderedValue = renderer(Ctype);
} else {
renderedValue = "(no renderer found)";
}
请注意,只有Ctype
具有用作字典中键的确切类型时,才会有效;如果您还想要正确识别任何子类型,请删除字典并构建您自己的地图,该地图遍历所搜索类型的继承层次结构(使用Type.BaseType
property)。