2009-07-28 74 views
2

This question让我想到了如何编写一个需要包含类型参数变量列表的方法。在泛型类型定义中使用'params'的方法

一个方法是接受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的元组类(它定义了一个通用的接口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>>()) { ... } 

是否有性能方面的考虑在这里,或者是@这里有一个替代方法来实现这个语法?

+0

在.net框架中是否没有东西检查列表中是否存在项目?你这样做的目的是什么,除了对象的扩展吗? – shahkalpesh 2009-07-28 16:23:34

回答

1

你可以可以通过展开循环到特殊情况下为每个“元数”挤出一点点额外的速度:

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)); 
} 

等。

但是,那么您多久需要知道一个对象是一对还是另一对不相关的类型?更不用说三个或更多。对我来说似乎很模糊。