在C#8中切换System.Type上的表达式

问题描述 投票:1回答:1

我很好奇,还有其他方法可以在C#8中使用新的switch表达式编写类似的内容吗?

public static object Convert(string str, Type type) =>
    type switch
    {
        _ when type == typeof(string) => str,
        _ when type == typeof(string[]) => str.Split(new[] { ',', ';' }),
        _ => TypeDescriptor.GetConverter(type).ConvertFromString(str)
    };

因为_ when type == typeof(string)看起来有点奇怪,尤其是当我们拥有type pattern和其他非常方便的乐器时。

c# switch-statement c#-8.0
1个回答
0
投票

正如其他人所暗示的那样,您实际上需要拥有一个可用类型的instance才能使用新的类型匹配功能,而不是代表性的System.Type。当前您已经在做的方法似乎是唯一的方法。

话虽如此,我会在这种情况下认为标准的switch语句可能更具可读性:

switch (type)
{
    case Type _ when type == typeof(string):
        return str;

    case Type _ when type == typeof(string[]):
        return str.Split(',', ';');

    default:
        return TypeDescriptor.GetConverter(type).ConvertFromString(str);
}

如果您really想要保留switch表达式,则可以通过匹配类型名称来解决此问题:

public static object Convert(string str, Type type) =>
    type.Name switch
    {
        nameof(string) => str,
        nameof(string[]) => str.Split(new[] { ',', ';' }),
        _ => TypeDescriptor.GetConverter(type).ConvertFromString(str)
    };
© www.soinside.com 2019 - 2024. All rights reserved.