2009-07-28 9 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)))であると私は1つの方法を定義する代替アプローチについて疑問に思って任意の量の一般的な議論をとる。何か似へ:

はこれに
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

+0

はい、List.Containsがあります。問題は、メソッドの総称引数の定義で 'params 'を使うことができないということです。元の目的はオブジェクトの拡張ですが、他の場所でも適用できます。 – Jason

答えて

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

と。

しかし、オブジェクトが無関係なタイプのペアのどちらか一方であるかどうかを知る必要がありますか? 3つ以上を聞かせてください。かなり私の必要はないようです。

関連する問題