Expression<Func<MemberViewModel, bool>>
을 Expression<Func<Member, bool>>
으로 변환하려면 ExpressionVisitor
클래스를 확장해야합니다. MemberViewModel
에는 필드와 속성 만 있다고 가정했습니다. 물론 Member
은 동일한 필드 및 속성 집합을 구현해야합니다. 이 경우 다음과 같은 작업을해야합니다 :
public class ParameterModifier<TSrc, TDest> : ExpressionVisitor
{
ParameterExpression parameter;
public ParameterModifier()
{
parameter = Expression.Parameter(typeof(TDest), "member");
}
protected override Expression VisitParameter(ParameterExpression node)
{
if (node.Type == typeof(TSrc))
{
return parameter;
}
else
return base.VisitParameter(node);
}
protected override Expression VisitMember(MemberExpression node)
{
if (node.Expression.Type == typeof(TSrc))
{
return Expression.PropertyOrField(Visit(node.Expression), node.Member.Name);
}
else
{
return base.VisitMember(node);
}
}
protected override Expression VisitLambda<T>(Expression<T> node)
{
if (node.Parameters.Any(p => p.Type == typeof(TSrc)))
{
return Expression.Lambda(Visit(node.Body), node.Parameters.Select(p => p.Type == typeof(TSrc) ? parameter : p));
}
else
{
return base.VisitLambda<T>(node);
}
}
}
을 위의 클래스를 사용하여 지금 변환 할 수있는 두 번째 방법에 술어를 통과하기 전에 :
IEnumerable<MemberViewModel> GetByProperty(Expression<Func<MemberViewModel, bool>> whereCondition)
{
var converter = new ParameterModifier<MemberViewModel, Member>();
var convertedExpression = converter.Visit(original) as Expression<Func<Member, bool>>;
IEnumerable<Member> members = GetByProperty(convertedExpression);
return members.Select(new MemberViewModel(member));
}
당신이 번역 무엇을 의미합니까? getsingle 한테 전화하고 싶니? –
어떻게 그 두 가지 방법으로 의사 소통을합니까? whereCondition을 두 번째 메서드로 전달하는 것만으로는 사용할 수 없습니까? – user384080