2009-07-28 45 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)); 
} 

等。

但是,那麼您多久需要知道一個對象是一對還是另一對不相關的類型?更不用說三個或更多。對我來說似乎很模糊。

相關問題