我有這樣的方法:如何更改表達式樹中的類型?
private bool Method_1(Expression<Func<IPerson, bool>> expression)
{
/* Some code that will call Method_2 */
}
在這種方法我想改變IPerson
類型爲另一種類型。我想打電話,看起來像這樣一種方法:
private bool Method_2(Expression<Func<PersonData, bool>> expression)
{
/* Some code */
}
所以,在method_1
我需要改變IPerson
到PersonData
。我怎樣才能做到這一點?
編輯:
當我打電話:Method_1(p => p.Id == 1)
我想「拯救」的條件(p.Id == 1
),但我想在另一種類型,即IPerson
執行這一條件。所以,我需要改變的表達或創建IPerson
編輯II一種新的表達:
對於那些有興趣誰,這就是(現在)我的解決方案:
private class CustomExpressionVisitor<T> : ExpressionVisitor
{
ParameterExpression _parameter;
public CustomExpressionVisitor(ParameterExpression parameter)
{
_parameter = parameter;
}
protected override Expression VisitParameter(ParameterExpression node)
{
return _parameter;
}
protected override Expression VisitMember(MemberExpression node)
{
if (node.Member.MemberType == System.Reflection.MemberTypes.Property)
{
MemberExpression memberExpression = null;
var memberName = node.Member.Name;
var otherMember = typeof(T).GetProperty(memberName);
memberExpression = Expression.Property(Visit(node.Expression), otherMember);
return memberExpression;
}
else
{
return base.VisitMember(node);
}
}
}
這是我使用它的方式:
public virtual bool Exists(Expression<Func<Dto, bool>> expression)
{
var param = Expression.Parameter(typeof(I));
var result = new CustomExpressionVisitor<I>(param).Visit(expression.Body);
Expression<Func<I, bool>> lambda = Expression.Lambda<Func<I, bool>>(result, param);
bool exists = _repository.Exists(lambda);
return exists;
}
'IPerson'和'PersonData'之間有關係嗎? – GolfWolf 2013-02-18 09:16:07
@ w0lf不,他們不認識對方。 'PersonData'是接口的DTO版本('IPerson')。 – Martijn 2013-02-18 09:17:37
我看不出如何做到這一點。你可以發表一個具體表達式如何看起來像的例子,如果你可以手動使用'PersonData',你會如何轉換它? – GolfWolf 2013-02-18 09:19:22