This question让我思考如何编写一个需要包含类型参数变量列表的方法。
一种方法是接受 params Type[]
作为参数的一部分,例如:
public static bool IsOneOf(this object obj, params Type[] types)
{
return types.Contains(obj.GetType());
}
但是,使用有点冗长(例如 obj.IsOneOf(typeof(int), typeof(bool), typeof(double))
),我想知道是否有替代方法来定义一个采用任意数量的通用参数的方法。类似于:
public static bool IsOneOf<params TArgs[]>(this object obj)
{
// use TArgs here
}
一个解决方案是使用 4.0 BCL 的 Tuple 类(它定义了一个公共(public)接口(interface) ITuple
以及 Tuple<T1>
、 Tuple<T1, T2>
等)来定义如下内容:
public static bool IsOneOf<TTypes>(this object obj) where TTypes : ITuple
{
Type tupleType = typeof(TTypes);
return tupleType.GetGenericArguments().Contains(obj.GetType());
}
然后可以这样使用:
if (obj.IsOneOf<Tuple<int, bool, decimal>>()) { ... }
这里是否有性能方面的考虑,或者是否有实现此语法的替代方法?
通过将循环展开为每个“arity”的特殊情况,您可以挤出一点额外的速度:
static bool IsOneOf<T1>(object o)
{
return (o.GetType() == typeof (T1));
}
static bool IsOneOf<T1, T2>(object o)
{
return (o.GetType() == typeof(T1)) ||
(o.GetType() == typeof(T2));
}
static bool IsOneOf<T1, T2, T3>(object o)
{
return (o.GetType() == typeof(T1)) ||
(o.GetType() == typeof(T2)) ||
(o.GetType() == typeof(T3));
}
等等。
但是,您多久需要知道一个对象是一对不相关类型中的一个还是另一个?更不用说三个或更多了。对我来说似乎是一个模糊的需求。
我是一名优秀的程序员,十分优秀!