我有以下方法,它将一种类作为参数:
public void test(Type proType){
}
我目前有一个很大的if else
,如下所示:
if(proType == typeof(Class)){}
因为大约有十个这看起来不整洁。
我尝试将其转换为开关但无法使其正常工作。
有没有更好的做法可以让这个或那个让switch语句工作?
switch (proType)
{
case typeof(ClassName):
break;
}
“需要恒定值”
该功能被称为test(typeof(class))
所以目标是我有一个包含许多小类的Big对象。
typeof(class)switch / if语句允许我决定进入哪个容器来获取对象。
答案 0 :(得分:7)
那么,如何让你正在测试的所有对象共享一个共同的界面呢?
interface ITestable
{
void DoSomething();
}
并且每个对象以不同方式实现此接口:
class MySomething : ITestable
{
public void DoSomething()
{
//type specific implementation
}
}
class MyOtherSomething : ITestable
{
public void DoSomething()
{
//type specific implementation
}
}
现在:
foreach(ITestable testable in myTestablesList)
{
testable.DoSomething();
}
并且所有切换逻辑都消失了。多田!
答案 1 :(得分:3)
你真正尝试实现的目标是什么?我猜这10次中的9次,当你切换某种物体的类型时,你的设计是有缺陷的。在大多数情况下,虚拟调度或多态(或两者)都是您真正需要的,但不知道您试图解决的问题是什么,不能肯定地说。
答案 2 :(得分:3)
我通常使用Dictionary来为每种类型创建一个动作缓存;如果预先知道类型,则在启动时加载它,或者使用TryGetValue并在失败时填充。
答案 3 :(得分:1)
如果您感兴趣的类型属于TypeCode枚举,则可以使用switch(Type.GetTypeCode(proType))
。例如,来自docs:
static void WriteObjectInfo(object testObject)
{
TypeCode typeCode = Type.GetTypeCode( testObject.GetType() );
switch( typeCode )
{
case TypeCode.Boolean:
Console.WriteLine("Boolean: {0}", testObject);
break;
case TypeCode.Double:
Console.WriteLine("Double: {0}", testObject);
break;
default:
Console.WriteLine("{0}: {1}", typeCode.ToString(), testObject);
break;
}
}