如何在类型上使用switch-case?
如何在类型上使用switch-case?
我需要遍历我的类的所有属性,并检查它的类型是否为int,如果是字符串...然后做一些事情。我需要使用switch-case。在下面的代码中,我使用switch,但它要求一些常量。请参见下面的代码:
public static bool ValidateProperties(object o) { if(o !=null) { var sourceType = o.GetType(); var properties = sourceType.GetProperties(BindingFlags.Public | BindingFlags.Static); foreach (var property in properties) { var type = property.GetType(); switch (type) { *case typeof(int):* 在这里出错了 // d } } } }
另外我想知道,我应该使用typeof(int)还是typeof(Int32)来进行检查?
如何在类型上使用switch-case?
在C#中,不能使用switch语句块来测试类型为Type的值。编译代码时会出现错误,提示如下:
"switch表达式或case标签必须是bool、char、string、integral、enum或相应的可空类型"。
解决方法是使用if-else语句代替switch语句块。此外,typeof(int)和typeof(Int32)是等效的,int是关键字,Int32是类型名称。
如果你预计大多数类型都是内在类型,可以通过使用switch语句块和Type.GetTypeCode(...)来提高性能。
例如:
switch (Type.GetTypeCode(type)) { case TypeCode.Int32: // 这是一个int类型 break; case TypeCode.String: // 这是一个string类型 break; // 其他类型代码的case语句... default: // 回退到使用if-else语句... if (type == typeof(MyCoolType)) { // ... } else if (type == typeof(MyOtherType)) { // ... } // 等等... }
通过以上方法,你可以在C#中使用switch-case来处理类型。
在这个问题中,原作者想要知道如何在C#中使用switch-case语句来处理不同类型的对象。为了解决这个问题,他提出了一种使用类型和适当类型的委托构成的字典的方法。通过将每个类型与相应的委托关联起来,可以根据需要执行相应的操作。
解决方法是创建一个字典typeProcessorMap
,它将类型作为键,将适当类型的委托作为值。例如,可以将int类型与处理int类型对象的委托相关联,将string类型与处理string类型对象的委托相关联。然后,可以通过调用typeProcessorMap[t].DynamicInvoke(o)
来执行相应的委托。
这种解决方法具有可扩展性和配置性,甚至可以在运行时进行配置。只要保持typeProcessorMap
中键和委托值的类型正确匹配,该解决方法也是类型安全的。
然而,需要注意的是,DynamicInvoke
在性能关键的部分可能会稍慢。为了提高性能,可以将所有委托的类型设置为Action<object>
,并在委托内部对参数进行类型转换。但需要注意的是,DynamicInvoke
的具体实现细节不清楚。
在这个的问题中,还提到了一个链接,可以查看该解决方法的实际应用情况。不幸的是,该链接在某些浏览器中打不开。
通过使用类型和委托的字典,可以解决在C#中使用switch-case处理不同类型对象的问题。这种解决方法具有可扩展性和配置性,并且在保持类型匹配的情况下是类型安全的。但需要注意的是,在性能关键的部分可能会稍微慢一些。