Expression.Propertyの結果をキャストする

c# expression-trees reflection

質問

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

問題は、 string型のプロパティがあることです。

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

そして、 stringExpression<Func<T, object>> )の代わりに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キャストする必要があるとMemberExpressionしていobject

受け入れられた回答

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;
}


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ