基于变量类型的方法

时间:2013-12-15 11:08:27

标签: class c#-4.0 design-patterns methods

我只是有以下情况 我想从方法返回字符串,但方法应该基于变量类型,即(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) 等等 我该怎么做?

2 个答案:

答案 0 :(得分:0)

你应该使用模板功能

public customRender<T>(T ctype)
{
    if(ctype is TextBox){
        //render textbox
    }
    else if(ctype is DropDown){
        //render dropdown
    }
}
希望它会有所帮助

答案 1 :(得分:0)

首先,即使您没有see ifswitch,某些功能中仍然会隐藏一个地方。如果没有控制流的任何这种分支,那么在运行时区分类型在编译时是不可能的。

您可以使用其中一个集合类在运行时构建映射,将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)。