据我所知,C#编译器不支持像
那样打开Typeswitch (typeof(MyObj))
case Type1:
case Type2:
case Type3:
有些解决方案可以使用Type of Type和Action类或静态类(link),但我只是很好奇,为什么这是一个不好的做法还是没有在编译器中实现?
提前谢谢。
答案 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()并打开它。这是不推荐的做法,因为你那么硬编码允许更改到你的交换机的字符串,但你可以这样做。