如何在类型上使用switch-case?

15 浏览
0 Comments

如何在类型上使用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)来进行检查?

0
0 Comments

如何在类型上使用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来处理类型。

0
0 Comments

在这个问题中,原作者想要知道如何在C#中使用switch-case语句来处理不同类型的对象。为了解决这个问题,他提出了一种使用类型和适当类型的委托构成的字典的方法。通过将每个类型与相应的委托关联起来,可以根据需要执行相应的操作。

解决方法是创建一个字典typeProcessorMap,它将类型作为键,将适当类型的委托作为值。例如,可以将int类型与处理int类型对象的委托相关联,将string类型与处理string类型对象的委托相关联。然后,可以通过调用typeProcessorMap[t].DynamicInvoke(o)来执行相应的委托。

这种解决方法具有可扩展性和配置性,甚至可以在运行时进行配置。只要保持typeProcessorMap中键和委托值的类型正确匹配,该解决方法也是类型安全的。

然而,需要注意的是,DynamicInvoke在性能关键的部分可能会稍慢。为了提高性能,可以将所有委托的类型设置为Action<object>,并在委托内部对参数进行类型转换。但需要注意的是,DynamicInvoke的具体实现细节不清楚。

在这个的问题中,还提到了一个链接,可以查看该解决方法的实际应用情况。不幸的是,该链接在某些浏览器中打不开。

通过使用类型和委托的字典,可以解决在C#中使用switch-case处理不同类型对象的问题。这种解决方法具有可扩展性和配置性,并且在保持类型匹配的情况下是类型安全的。但需要注意的是,在性能关键的部分可能会稍微慢一些。

0
0 Comments

通常,最简单的解决方法是根据类型名称进行切换:

switch (type.Name)
{
    case "Int32":
    ...
}

在我看来,牺牲类型安全性是不值得的。毕竟,if/else链几乎同样简洁,而且具有在编译时捕捉拼写错误(更重要的是 - 未来的重构)的优点。

你们听说过单元测试吗?无论如何,我有时会使用Jon的方法,但这通常是过度设计。

单元测试不能替代类型安全性。

0