是什么阻止C#编译器在'Type'上实现'Switch'语句?

时间:2013-11-12 15:09:50

标签: c# .net compiler-optimization

据我所知,C#编译器不支持像

那样打开Type
switch (typeof(MyObj))
    case Type1:
    case Type2:
    case Type3:

有些解决方案可以使用Type of Type和Action类或静态类(link),但我只是很好奇,为什么这是一个不好的做法还是没有在编译器中实现?

提前谢谢。

3 个答案:

答案 0 :(得分:1)

如果你在谈论原始类型,你可以切换TypeCode

var typeCode = Type.GetTypeCode(type);    
switch (typeCode)
{
    case TypeCode.Empty:
        break;
    case TypeCode.Object:
        break;
    case TypeCode.DBNull:
        break;
    case TypeCode.Boolean:
        break;
    case TypeCode.Char:
        break;
    case TypeCode.SByte:
        break;
    case TypeCode.Byte:
        break;
    case TypeCode.Int16:
        break;
    case TypeCode.UInt16:
        break;
    case TypeCode.Int32:
        break;
    case TypeCode.UInt32:
        break;
    case TypeCode.Int64:
        break;
    case TypeCode.UInt64:
        break;
    case TypeCode.Single:
        break;
    case TypeCode.Double:
        break;
    case TypeCode.Decimal:
        break;
    case TypeCode.DateTime:
        break;
    case TypeCode.String:
        break;
}

BTW回答您的问题,您可能需要阅读How many Microsoft employees does it take to change a lightbulb?

答案 1 :(得分:1)

我会推荐您接受以下答案:switch statement in C# and "a constant value is expected"。编译器需要在编译时知道不会有任何重复,因此它只接受常量。顺便说一下,你可以用

达到同样的效果
switch (typeof(MyObj).FullName 

并使用每种类型的名称作为案例条件,例如:

case "MyNamespace.Type1":
   /*stuff*/
   break;
case "MyNamespace.Type2":
   /*other stuff*/
   break;
default:
   /*default stuff*/

答案 2 :(得分:1)

您何时使用开启类型?我能想到的大多数情况都可以通过继承来解决,而不是做:

switch (typeof(MyObj)) {
    case Type1: doSomethingForType1; break;
    case Type2: doSomethingForType2; break;
    case Type3: doSomethingForType3; break;

您可以采用更加面向对象的方式进行设置:

Interface ISpecialType {
    void doSomething();
}
Type1 : ISpecialType {
    doSomething() {}
}
Type2 : ISpecialType {
    doSomething() {}
}
Type3 : ISpecialType {
    doSomething() {}
}

然后,无论如何,你只需要打电话MyObj.doSomething();在开始时输入更多一点,但更强大。

另外,如果你打开它真的很重要,你可以随时使用typeof(MyObj).toString()并打开它。这是不推荐的做法,因为你那么硬编码允许更改到你的交换机的字符串,但你可以这样做。