4

在我当前的代码中,我正在使用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,而是尝试使用 压缩所有is语句Extension Method,但无济于事。

这是我的尝试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 + "]");
  }

有谁知道为什么会失败?任何帮助将不胜感激!

4

3 回答 3

9

您需要将类型传递给它,而不是类名。您还应该使用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完全匹配类型,因此您可能想要 isIsSubclassOfIsAssignableFrom代替

例如

return types.Any(t => t.IsAssignableFrom(obj.GetType()));
于 2013-06-10T16:35:48.753 回答
4

所以你在这里有几个问题。其中第一行是: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));
于 2013-06-10T16:39:29.117 回答
1

游戏晚了,但如果你想保持通用语法并避免使用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;
}

并继续为其他数量的T1through编写重载TN(其中N是您期望的最大数量。

您的用法如下所示:

else if (value.Is<SolidColorBrush, LinearGradientBrush, GradientBrush, RadialGradientBrush>())
于 2013-06-10T17:10:29.963 回答