2012-05-10 24 views
3

タイプがIQueryableかどうかを知りたい。パラメータタイプに関係なく、パラメータ化タイプでフィルタを適用するにはどうすればよいですか?

var t = typeof(IQueryable<int>); 
bool isQueryable = (t is IQueryable); // false 
bool isAssignableFrom = t.IsAssignableFrom(typeof(IQueryable)); // false 
bool nameStartsWithIQueryable = t.Name.StartsWith("IQueryable"); // true 

第3の方法 - タイプ名の冒頭を見て - は動作しますが、ハックのように感じます。

これを達成する別の方法はありますか?

答えて

5

使用GetGenericTypeDefinition:そうのようにそれを呼び出す

public static bool IsType(Type type, Type ancestor) 
{ 
    while (type != null) 
    { 
     if (type.IsGenericType) 
      type = type.GetGenericTypeDefinition(); 
     if (type == ancestor) 
      return true; 
     type = type.BaseType; 
    } 
    return false; 
} 

あなたは(あなたが基本型aganistチェックされている)より深い祖先を処理する必要がある場合は
bool isQueryable = t.GetGenericTypeDefinition() == typeof(IQueryable<>); 

、あなたはヘルパーメソッドを書くことができます:

bool isQueryable = IsType(typeof(IQueryable<int>), typeof(IQueryable<>)); 

(これは、他のものを実装する基本タイプインタフェースは、その反対をチェックするので、再帰的にType.GetInterfacesを使用して、より多くのコードが必要になります)

1

はあなただけ後方IsAssignableFromを持って、それは次のようになります。

typeof(IQueryable).IsAssignableFrom(t); 

私は一般的なケースではIsAssignableFromを使用して好むときの理由インターフェイスを扱っていないので、IsAssignableFromは、クラスがユーザ定義の変換演算子を含意するかどうかを真に示します。さらに、タイプ階層などを処理する必要はありません。

+1

これは、 'IQueryable ' *がベース・インターフェースでもある非ジェネリック 'IQueryable'を持つためにのみ有効です。一般的なケースでは機能しません。 –