我很好奇,还有其他方法可以在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和其他非常方便的乐器时。
正如其他人所暗示的那样,您实际上需要拥有一个可用类型的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)
};