方法处理多个“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 + "]");
}
有人知道为什么这是失败的吗?任何帮助将非常感激!
您需要向它传递类型,而不是类名。您还应该使用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
与类型完全匹配,因此您可能希望使用IsSubclassOf
或IsAssignableFrom
来代替
如
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;
}
并继续为T1
到TN
的其他数字(其中N
是您期望的最大数字)写重载。
你的用法看起来像:
else if (value.Is<SolidColorBrush, LinearGradientBrush, GradientBrush, RadialGradientBrush>())