如何按参数化类型进行筛选,而不考虑其参数类型

本文关键字:不考虑 参数 类型 筛选 何按 参数化类型 | 更新日期: 2023-09-27 18:33:44

我想知道一个类型是否是智商的。

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

第三种方式 - 查看类型名称的开头 - 有效,但感觉像黑客。

有没有其他方法可以做到这一点?

如何按参数化类型进行筛选,而不考虑其参数类型

使用 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递归的代码。

你只需要把IsAssignableFrom倒过来,它应该是:

typeof(IQueryable).IsAssignableFrom(t);

在一般情况下,我更喜欢使用 IsAssignableFrom,因为当您不处理接口时,IsAssignableFrom 会告诉您 true 如果一个类作为隐式用户定义的转换运算符。另外,您不必处理类型层次结构等...