我一直在寻找一种方法来重构和简化一个函数,我必须根据输入类类型进行数据排序,并且卡在switch(input.GetType()):
快速搜索引导我Why doesn't C# switch statement allow using typeof/GetType()?,其中包含指向http://blogs.msdn.com/peterhal/archive/2005/07/05/435760.aspx
的链接我阅读了文档,但我没有理由认为情况令人困惑。
来自文章:
不幸的是,像许多'简单'一样 语言功能,类型切换不是 就像它第一次出现一样简单。该 当你看到更多时,麻烦就开始了 重要的,同样重要的, 像这样的例子:
class C {}
interface I {}
class D : C, I {}
switch typeof(e) {
case C: ... break;
case I: ... break;
default: ... break;
}
有什么不简单的?来电typeof(e)
无法返回 - 这是I
D
和C
。它必须返回Type
而不是接口和类类型数组 - Type[]
。因此class D
的类型为D
。 D
对应default:
分支。
我错过了什么?
答案 0 :(得分:4)
似乎你不希望开关在子类上匹配。但这会破坏Liskov替代原则。 (如果你传入一个C对象,代码可以工作,但不能用D,即使D是C的子类。)
答案 1 :(得分:3)
我认为对于Peter Hallam的博客文章来说,如果你重新排序,你不希望switch
语句有所不同,这是非常有效的,所以只有一个分支同时有效才真正有用,而对于Type
,一个类在继承链中始终是多个不同的类型。
没有人会阻止你使用if ... else链进行此操作,你可以按照你放置的顺序对它进行评估。