【问题标题】:Determine the return type of dynamic type判断动态类型的返回类型
【发布时间】:2012-01-24 07:30:41
【问题描述】:

我选择在 LINQ 连接查询中为临时投影创建匿名类型。我正在使用 ExpressionTrees,在运行时构建查询。我不知道下面的代码是否能帮助我创建一个临时的投影序列。

这是执行临时投影的代码:

private Expression<Func<EntityObject, EntityObject,dynamic>> TempProjectionExpression
    {
        get
        {
            return (o, p) => new
            {
                o = o,
                p = p
            };
        }
    }

下面给出了我使用表达式树的联接查询。

    public IQueryable<dynamic> GetQueryExpressionresults3<T, U, V>(IQueryable<T> aEntityCollection1, IQueryable<U> aEntityCollection2, Type[] _TypeArguments ,V _anonymousType, string aPropertyName)
        where T : EntityObject
        where U : EntityObject
    {
        ParameterExpression pe = Expression.Parameter(typeof(U), "o");
        ParameterExpression pe1 = Expression.Parameter(typeof(T), "p");

        //This should be populated from UI
        Expression me = Expression.Property(pe1, typeof(T).GetProperty(aPropertyName));
        //This should be populated from UI
        Expression me1 = Expression.Property(pe, typeof(U).GetProperty(aPropertyName));

        LambdaExpression le = Expression.Lambda<Func<T, int>>(me, new ParameterExpression[] { pe1 });
        LambdaExpression le1 = Expression.Lambda<Func<U, int>>(me1, new ParameterExpression[] { pe });

        _TypeArguments = new Type[] { aEntityCollection1 .ElementType, aEntityCollection2.ElementType, le.Body.Type, typeof(MovieCollections)};
        //_TypeArguments = _TypeArguments.Concat(new Type[] { le.Body.Type, typeof(object) }).ToArray();

        MethodCallExpression JoinCallExpression = Expression.Call(typeof(Queryable), "Join", _TypeArguments, aEntityCollection1.Expression, aEntityCollection2.Expression
            , le, le1, TempProjectionExpression);

        var oResult = aEntityCollection1.Provider.CreateQuery(JoinCallExpression) as IQueryable<dynamic>;

        return oResult;
    }

现在的问题是,我想确定 TempProjectionExpression 的返回类型,即 typeof(dynamic)。这可能吗?如果是,那么如何?

【问题讨论】:

    标签: linq dynamic


    【解决方案1】:

    typeof(dynamic) 不能比System.Object 做得更好(编译器甚至不会尝试这样做),这不是一个非常有趣的结果。

    不过,您可以使用returnedResult.GetType() 来获取其运行时类型。

    由于dynamic 将类型解析推迟到运行时,如果不对您的表达式树进行值得 C# 编译器本身的类型分析,就无法在实际返回某些内容之前判断返回是什么。

    【讨论】:

    • typeof(dynamic) 给出编译时错误。我尝试使用 TempProjectionExpression.Body.Type 来确定动态类型的返回类型。它没有给出任何编译器错误,但不确定它是否正确。
    猜你喜欢
    • 2012-12-27
    • 2018-03-03
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 2015-12-19
    • 1970-01-01
    相关资源
    最近更新 更多