Expression.Property 결과 캐스팅

c# expression-trees reflection

문제

Expression 트리를 동적으로 생성 할 때 캐스트를 어떻게 만듭니 까?

문제는, 나는 string 타입의 프로퍼티를 가진다는 것이다.

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

그리고 나는 string ( Expression<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 로 형변환해야한다고 가정 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는 합법적입니까? 예, 이유를 알아보십시오.