3

Expressionツリーを動的に作成するときにキャストを作成するにはどうすればよいですか?

問題は、タイプのプロパティがあることですstring:

public class Test
{
    public string Id { get; set; }
}

そして、 ( ) のobject代わりにを返すデリゲートを表す、厳密に型指定されたラムダ式を一般的に作成したいと考えています。stringExpression<Func<T, object>>

今、私はこれをやっています:

private static Expression<Func<T, object>> CreateIdQuery()
{
    Type type = typeof(T);
    PropertyInfo idProperty = type.GetProperty("Id");
    ParameterExpression lambdaParam = Expression.Parameter(type, "x");
    MemberExpression body = Expression.Property(lambdaParam, idProperty);
    LambdaExpression expr = Expression.Lambda(body, lambdaParam);
    return (Expression<Func<T, object>>)expr;
}

しかし、最後の行で例外がスローされます (にキャストできませんExpression<Func<Test, string>>) Expression<Func<Test, object>>

式の本体をキャストするにはどうすればよいですか (MemberExpression一部を にキャストする必要があると想定していますobject)。

4

1 に答える 1

7

を使用しExpression.Convert(body, typeof(object))ます。

private static Expression<Func<T, object>> CreateIdQuery()
{
    Type type = typeof(T);
    PropertyInfo idProperty = type.GetProperty("Id");
    ParameterExpression lambdaParam = Expression.Parameter(type, "x");
    MemberExpression body = Expression.Property(lambdaParam, idProperty);
    UnaryExpression converted = Expression.Convert(body, typeof(object));
    LambdaExpression expr = Expression.Lambda(converted, lambdaParam);
    return (Expression<Func<T, object>>)expr;
}
于 2012-08-02T14:28:24.067 に答える