类类型的 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 语句允许我决定进入哪个容器来取出对象。

类类型的 C# 开关

那么,如何使正在测试的所有对象共享一个通用接口?

 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;
    }
}