代码之家  ›  专栏  ›  技术社区  ›  Craig Stuntz

如何查询。OfType工作?

  •  5
  • Craig Stuntz  · 技术社区  · 16 年前

    重要 问题不是“什么是Queryable.OfType

        public static IQueryable<TResult> OfType<TResult>(this IQueryable source)
        {
            return (IQueryable<TResult>)source.Provider.CreateQuery(
                Expression.Call(
                    null, 
                    ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(
                        new Type[] { typeof(TResult) }) ,
                        new Expression[] { source.Expression }));
        }
    

    1. 使用反射来获取对当前方法(OfType)的引用。
    2. 通过使用MakeGenericMethod将当前方法的类型参数更改为,呃,完全相同的东西,创建一个完全相同的新方法。
    3. 新方法的参数不是源,而是源。表情。这不是一个IQuery,但我们将把整个事情传递给Expression。打电话,没关系。
    4. null 作为 例子

    1 回复  |  直到 16 年前
        1
  •  5
  •   Jon Skeet    16 年前

    它不会进来的 null 作为方法-它将其作为“目标表达式”传递,即它调用方法的对象。这是null,因为 OfType

    打电话的意义 MakeGenericMethod GetCurrentMethod() 返回打开的版本,即。 OfType<> 而不是 OfType<YourType> .

    Queryable.OfType 本身不是 意味着 可查询。OfType 是构建表达式树以包含以下调用 OfType OfType

    就是这样 Queryable 一般来说,它可以让提供者将整个查询表达式视为表达式树。这就是它的全部目的——当要求提供商将其转换为真实代码时,

    可查询的 它不可能自己完成这项工作——它不知道提供者代表什么样的数据存储。它怎么能得出以下语义 OfType