C#切换类的类型

时间:2013-10-01 13:46:16

标签: c# if-statement switch-statement typeof

我有以下方法,它将一种类作为参数:

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

4 个答案:

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