方法处理多个“Is"”语句

本文关键字:quot 语句 Is 处理 方法 | 更新日期: 2023-09-27 18:17:40

在我当前的代码中,我正在使用if/else if &is:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is double)
        {
            //do something
        }
        else if (value is int)
        {
            //do something
        }
        else if (value is string)
        {
            //do something
        }
        else if (value is bool)
        {
            //do something
        }
       Type type = value.GetType();
       throw new InvalidOperationException("Unsupported type [" + type.Name + "]");
    }

与其有一个长长的else if列表,我试图用Extension Method来压缩所有的is语句,但无济于事。

这是我对Extension Method的尝试:

public static class Extensions
    {
        public static bool Is<T>(this T t, params T[] values)
        {
            return values.Equals(t.GetType());
        }
    }

和方法:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is double)
        {
            //do something
        }
        else if (value.Is<object>(int, string, bool))
        {
            //do something
        }
        Type type = value.GetType();
        throw new InvalidOperationException("Unsupported type [" + type.Name + "]");
  }

有人知道为什么这是失败的吗?任何帮助将非常感激!

方法处理多个“Is"”语句

您需要向它传递类型,而不是类名。您还应该使用Contains而不是Equals:

public static bool IsAny(this object obj, params Type[] types)
{
    return types.Contains(obj.GetType());
}
if(value.IsAny(typeof(SolidColorBrush), typeof(LinearGradientBrush), typeof(GradientBrush), typeof(RadialGradientBrush)))
{
}

Contains与类型完全匹配,因此您可能希望使用IsSubclassOfIsAssignableFrom来代替

return types.Any(t => t.IsAssignableFrom(obj.GetType()));

这里有几个问题。其中第一行是:values.Equals(t.GetType())。您不是检查集合的每个值,而是检查集合作为一个整体是否等于一个类型。因为一个是object[],一个是Type,它们永远不会相等。您需要检查集合中的任何值是否等于该类型。

接下来,你不希望形参是一堆对象,你希望它们是一堆类型。

这里有一个更好的解决方案:

public static bool IsAny(this object obj, params Type[] types)
{
    return types.Any(type => type.IsAssignableFrom(obj.GetType()));
}

你可以这样使用:

bool b = "a".IsAny(typeof(int), typeof(double), typeof(MyClass));

晚了,但是如果你想保持泛型语法并避免使用typeof,你可以创建一系列泛型重载,增加泛型参数的数量,达到一些合理的限制(就像Action<,,,>Func<,,,>一样)

public static bool Is<T1, T2, T3, T4>(this object obj)
{
    return  obj is T1 ||
            obj is T2 ||
            obj is T3 ||
            obj is T4;
}

并继续为T1TN的其他数字(其中N是您期望的最大数字)写重载。

你的用法看起来像:

else if (value.Is<SolidColorBrush, LinearGradientBrush, GradientBrush, RadialGradientBrush>())