当前位置:  开发笔记 > 编程语言 > 正文

C#切换类型

如何解决《C#切换类型》经验,为你挑选了2个好方法。

编辑:现在可以在C#7.0中使用.


我有以下的片,检查给定的代码PropertyInfotype.

PropertyInfo prop;

// init prop, etc...

if (typeof(String).IsAssignableFrom(prop.PropertyType)) {
    // ...
}
else if (typeof(Int32).IsAssignableFrom(prop.PropertyType)) {
    // ...
}
else if (typeof(DateTime).IsAssignableFrom(prop.PropertyType)) {
    // ...
}

有没有办法switch在这种情况下使用语句?这是我目前的解决方案:

switch (prop.PropertyType.ToString()) {
    case "System.String":
        // ...
        break;
    case "System.Int32":
        // ...
        break;
    case "System.DateTime":
        // ...
        break;
    default:
        // ...
        break;
}

我不认为这是最好的解决方案,因为现在我必须给出给定的完全限定Stringtype.有小费吗?



1> budi..:

现在可以在C#7.0中使用它.

这个解决方案适合我原来的问题; switch语句的工作valuePropertyInfo,而不是它的PropertyType:

PropertyInfo prop;

// init prop, etc...

var value = prop.GetValue(null);

switch (value)
{
    case string s:
        // ...
        break;
    case int i:
        // ...
        break;
    case DateTime d:
        // ...
        break;
    default:
        // ...
        break;
}

稍微更通用的答案:

switch(shape)
{
    case Circle c:
        WriteLine($"circle with radius {c.Radius}");
        break;
    case Rectangle s when (s.Length == s.Height):
        WriteLine($"{s.Length} x {s.Height} square");
        break;
    case Rectangle r:
        WriteLine($"{r.Length} x {r.Height} rectangle");
        break;
    default:
        WriteLine("");
        break;
    case null:
        throw new ArgumentNullException(nameof(shape));
}

参考:https: //blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/



2> usr..:

我将完全按照询问的方式回答问题:没有办法。

switch从C#6开始,仅支持某些类型的匹配常量。您没有尝试匹配常量。您IsAssignableFrom多次调用该方法。

请注意,这IsAssignableFrom相同的精确匹配的类型。因此,任何基于相等性比较或哈希表的解决方案都行不通。

我认为if ... else if您拥有的解决方案完全可以。

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有