【问题标题】:How do I filter by a parameterized type irrespective of its parameter types?无论参数类型如何,如何按参数化类型进行过滤?
【发布时间】:2012-05-10 18:41:21
【问题描述】:

我想知道一个类型是否是 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。

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

【问题讨论】:

    标签: c# templates reflection


    【解决方案1】:

    使用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 的更多代码。)

    【讨论】:

      【解决方案2】:

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

      typeof(IQueryable).IsAssignableFrom(t);
      

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

      【讨论】:

      • 这只是因为IQueryable&lt;T&gt; 碰巧 有一个非泛型IQueryable 也是一个基本接口。它在一般情况下不起作用。
      猜你喜欢
      • 2013-06-16
      • 1970-01-01
      • 2017-11-28
      • 2021-06-30
      • 1970-01-01
      • 2017-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多