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

第三种方法 - 查看类型名称的开头 - 有效,但感觉就像一个 hack。

还有另一种方法可以做到这一点吗?

4

2 回答 2

5

使用GetGenericTypeDefinition

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

如果您需要处理更深层次的祖先(您正在检查 aganist 基类型),您可以编写一个辅助方法:

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 会告诉您是否将类作为隐式用户定义的转换运算符。另外,您不必处理类型层次结构等......

于 2012-05-10T19:15:42.360 回答