Определить тип возвращаемого значения динамического типа - PullRequest
3 голосов
/ 24 января 2012

Я решил создать анонимный тип для временной проекции в запросе LINQ Join. Я использую 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). Это возможно? Если да, то как?

1 Ответ

2 голосов
/ 24 января 2012

typeof(dynamic) не может быть лучше, чем System.Object (что компилятор даже не попытается сделать), что не очень интересно.

Вы можете использовать returnedResult.GetType(),тем не менее, чтобы получить его тип времени выполнения.

Поскольку dynamic откладывает разрешение типа до времени выполнения, невозможно определить, что является возвращением до того, как что-то действительно возвращается, без проведения анализа типов в дереве выражений, достойномСам компилятор C #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...