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番目の方法(型名の先頭を見る)は機能しますが、ハックのように感じます。

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

4

2 に答える 2

5

使用GetGenericTypeDefinition:

bool isQueryable = t.GetGenericTypeDefinition() == typeof(IQueryable<>);

より深い祖先を処理する必要がある場合 (基本型をチェックする場合)、ヘルパー メソッドを記述できます。

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

次のように呼び出します。

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

(これは、他のインターフェースを実装する基本型には役立たないことに注意してください。これをチェックするには、Type.GetInterfaces再帰的に使用するコードがさらに必要になるためです。)

于 2012-05-10T18:43:27.803 に答える
1

あなたはちょうどIsAssignableFrom後方を持っています、それはあるべきです:

typeof(IQueryable).IsAssignableFrom(t);

一般的なケースでは IsAssignableFrom を使用することを好みます。これは、インターフェイスを扱っていない場合、IsAssignableFrom は、クラスが暗黙的なユーザー定義の変換演算子である場合に true を通知するためです。さらに、型階層などを扱う必要はありません...

于 2012-05-10T19:15:42.360 に答える