Joa*_*nge 13 .net c# reflection switch-statement
如下例所示:
switch ( myObj.GetType ( ) )
{
case typeof(MyObject):
Console.WriteLine ( "MyObject is here" );
break;
}
Run Code Online (Sandbox Code Playgroud)
Tim*_*ely 19
其次是Peter Hallam的帖子; 这是一个很好的解释.
但是,您可以使用TypeCode处理简单类型.
switch (Type.GetTypeCode(myObj.GetType())) {
case TypeCode.Boolean: ...
case TypeCode.Char: ...
case TypeCode.String: ...
case TypeCode.Object: ...
default: ...
}
Run Code Online (Sandbox Code Playgroud)
Eri*_*ert 14
我会在彼得的优秀分析中加入以下思想:
基本上,"转换"的目的是选择一些不同的可能性之一.给定的枚举值,整数,布尔值或字符串类型只能是一个值,因此"切换"这样的值是有意义的.但类型根本不同.给定值通常有许多类型.类型经常重叠.所提出的"类型开关" 与开关结构的陈述目的不匹配.
Mar*_*ell 13
问题是switch
(根据规范)仅适用于基元(int等)和字符串.但是,是的,有F#式匹配会很不错.
从§8.7.2开始:
Run Code Online (Sandbox Code Playgroud)switch-label: case constant-expression : default :
... switch语句的控制类型由switch表达式建立.如果switch表达式的类型是sbyte,byte,short,ushort,int,uint,long,ulong,char,string或enum-type,那么这就是switch语句的控制类型.否则,从switch表达式的类型到以下可能的控制类型之一,必须存在一个用户定义的隐式转换(第6.4节):sbyte,byte,short,ushort,int,uint,long,ulong,char,string .如果不存在此类隐式转换,或者存在多个此类隐式转换,则会发生编译时错误.
然而,显而易见的是,使用这种受限制的集合允许简单(和有效)IL.请注意,string
通过字典映射处理整数.
Peter Hallam在MSDN上有一篇很好的博客文章,解释了切换非常量值的问题.
"案例标签的顺序在确定执行哪个代码块时变得非常重要.因为案例标签表达式不是常量,编译器无法验证案例标签的值是不同的,所以这是一种必须满足的可能性.这与大多数程序员对switch语句的直觉有很大的不同.大多数程序员都会惊讶地发现改变他们的case块的顺序改变了他们程序的意义.为了扭转它,这将是令人惊讶的如果打开的表达式等于案例标签中的表达式,但控件没有转到该标签."
你可以做
switch ( myObj.GetType().Name )
{
case "MyObject":
Console.WriteLine ( "MyObject is here" );
break;
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为切换仅适用于原始类型(正如其他人所说)。
归档时间: |
|
查看次数: |
17623 次 |
最近记录: |