类类型的 C# 开关
本文关键字:开关 类型 | 更新日期: 2023-09-27 18:33:32
我有以下方法,该方法将类类型作为参数:
public void test(Type proType){
}
我目前有一个大if else
,看起来像:
if(proType == typeof(Class)){}
由于大约有十个,这看起来不整洁。
我尝试将其转换为开关,但无法使其工作。
有没有更好的做法来让开关语句工作?
switch (proType)
{
case typeof(ClassName):
break;
}
"需要常量值"
该函数的调用方式类似于test(typeof(class))
所以目标是我有一个包含许多小类的大对象。
typeof(class) switch/if 语句允许我决定进入哪个容器来取出对象。
那么,如何使正在测试的所有对象共享一个通用接口?
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();
}
你所有的开关逻辑都消失了。哒哒!
你真正想要实现的目标是什么。我猜 10 次中有 9 次,当您切换某个对象的类型时,您的设计是有缺陷的。在大多数情况下,虚拟调度或多态性(或两者兼而有之)是您真正想要的,但是不知道您要解决的问题是什么,就无法确定。
我通常使用字典来创建要针对每种类型执行的操作的缓存;如果预先知道类型,则在启动时加载它,或者使用 TryGetValue 并在失败时填充。
如果您感兴趣的类型在 TypeCode 枚举中,则可以使用 switch(Type.GetTypeCode(proType))
。例如,从文档中:
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;
}
}