在C#中使用类型的switch case
在C#中使用类型的switch case
可能是重复的问题:
你好,假设我对类类型进行了一系列的if/else判断,有没有一种方法可以使用switch case来实现呢?
例如:
function test(object obj) { if(obj is WebControl) { }else if(obj is TextBox) { } else if(obj is ComboBox) { }
等等...
我想创建类似于以下的东西:
switch(obj) { case TextBox: break; case ComboBox: break; }
}
问题:为什么会出现(Switch case on type c#)这个问题以及解决方法?
在上述内容中,有人提出了一个关于在C#中使用switch case语句根据类型进行判断的问题。他们提供了一个示例代码,其中使用了obj.GetType().Name来获取对象的类型名称,并根据不同的类型名称执行不同的操作。然而,有人指出这种解决方案在遇到具有子类的情况下将无法正常工作。
问题的出现原因是,当存在子类时,根据类型名称进行判断将无法准确地匹配到子类的情况。例如,在示例中提到的情况下,如果有一个名为MyCustomTextBox的子类,它继承自TextBox类,那么上述代码将无法正确匹配到MyCustomTextBox类型。
针对这个问题,有人提出了一个解决方法,即在case语句中同时匹配TextBox和MyCustomTextBox两个类型。这样可以确保在遇到子类时也能正常执行相应的操作。然而,这种解决方法假设程序员已经知道了所有可能的子类,这在实际开发中并不现实。
另外,有人指出这段代码只是一个解决办法,它不会在编译时进行检查,因此可能会导致一些无法到达的代码。另外,还有人建议不要使用字符串来进行类型判断,因为在重构代码时可能会带来问题。
为了解决(Switch case on type c#)这个问题,我们应该考虑使用其他更可靠的方法来根据类型进行判断,而不是依赖于类型名称。这样可以避免遇到子类时无法正常执行的问题,并且能够保证代码的可维护性和可扩展性。
Switch case on type是一种在C#中使用的技巧,可以根据对象的实际类型进行分支判断。然而,这种方法存在一些问题,需要进行解决。
问题的出现原因是,当使用TypeSwitch类的Switch方法时,如果传入的对象是派生类型,就无法正确匹配到合适的Case。这是因为TypeSwitch类内部使用的Dictionary数据结构只能根据具体类型进行匹配,无法处理派生类型。
解决这个问题的方法是,在Switch方法中添加一个默认的Case,用于处理无法匹配到具体类型的情况。可以在Case链的最后添加一个typeof(Object)类型的Case,用于处理所有未匹配到的情况。
下面是具体的解决方案代码:
public class TypeSwitch { Dictionary> matches = new Dictionary >(); public TypeSwitch Case (Action action) { matches.Add(typeof(T), (x) => action((T)x)); return this; } public void Switch(object x) { if (matches.ContainsKey(x.GetType())) { matches[x.GetType()](x); } else { matches[typeof(Object)](x); } } }
这样,当无法匹配到具体类型时,Switch方法会调用typeof(Object)类型的Case进行处理。
总结起来,Switch case on type是一种方便的技巧,可以根据对象的实际类型进行分支判断。然而,由于只能匹配具体类型,无法处理派生类型,需要添加一个默认的Case来解决这个问题。通过这种方式,可以更好地利用Switch case语句的优势,提高代码的可读性和可维护性。
Switch case on type是一个在C#中的语法特性,它允许根据表达式的类型进行条件判断。这个特性在C# 7中被引入,用于简化代码逻辑。在之前的C#版本中,并没有直接支持switch case on type,这是一个常见的需求。
在一篇来自stackoverflow的帖子中,有人在C# 7中展示了如何使用switch case on type。他使用了一个形状(shape)的例子来说明。在这个例子中,根据形状的类型,执行不同的操作。如果形状是一个圆形(Circle),则输出圆形的半径;如果形状是一个正方形(Rectangle),且长度和宽度相等,则输出正方形的边长;如果形状是一个矩形(Rectangle),则输出矩形的长度和宽度;如果形状是null,则抛出ArgumentNullException异常。这个例子展示了使用switch case on type的语法,可以根据不同的类型执行不同的代码块。
然而,在C# 7之前,并没有直接支持switch case on type的语法。在一篇来自Microsoft的博客中,作者讨论了为什么没有直接支持switch case on type以及它的复杂性。他提到了一个例子,展示了当类型层次结构中存在多个类型时,使用switch case on type会遇到的问题。在这个例子中,有一个类C和一个接口I,类D继承自类C并实现了接口I。作者指出,使用switch case on type时,对于类型C和类型I的判断会出现问题,因为类D既是类型C的子类又实现了接口I。这个例子说明了在类型层次结构中使用switch case on type时可能会出现歧义和复杂性。
C# 7之前的版本没有直接支持switch case on type的语法,这是一个常见的需求。在C# 7中,引入了switch case on type的语法,可以根据表达式的类型进行条件判断。然而,使用switch case on type时需要注意类型层次结构和可能出现的歧义和复杂性。在C# 9及以上版本中,已经支持了switch on type的语法,进一步扩展了这个特性的应用范围。
下面是一些相关讨论的链接:
- [Stack Overflow: Switch case on type c#](http://stackoverflow.com/questions/7252186/7301514#7301514)
- [Microsoft 博客: Many Questions: Switch on Type](https://blogs.msdn.microsoft.com/peterhal/2005/07/05/many-questions-switch-on-type/)
- [Microsoft 博客: What's new in C# 7.0](https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/)