mam metody takie jak to:Jak zmienić typ w drzewie wyrażeń?
private bool Method_1(Expression<Func<IPerson, bool>> expression)
{
/* Some code that will call Method_2 */
}
W tej metodzie chcę zmienić typ innemu typowi IPerson
. Chcę wywołać inną metodę, która wygląda tak:
private bool Method_2(Expression<Func<PersonData, bool>> expression)
{
/* Some code */
}
Więc w method_1
muszę zmienić IPerson
do PersonData
. Jak mogę to zrobić?
Edit:
Kiedy zadzwonić: Method_1(p => p.Id == 1)
chcę „zapisz” warunek (p.Id == 1
), ale chcę, aby wykonać ten warunek na innego rodzaju, a mianowicie IPerson
. Więc muszę zmieniać ekspresję lub utworzyć nowe wyrażenie z IPerson
EDIT II:
Dla tych, którzy są zainteresowani, to jest (na razie) moje rozwiązanie:
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);
}
}
}
I jest tak, jak go używać:
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;
}
Czy istnieje związek między 'IPerson' i' PersonData'? – GolfWolf
@ w0lf Nie, nie znają się nawzajem. 'PersonData' to wersja interfejsu DTO (' IPerson'). – Martijn
Nie widzę, jak można to zrobić. Czy możesz podać przykład jak wyglądałoby konkretne wyrażenie i jak byś go przekształcił, aby używał 'PersonData', gdybyś mógł zrobić to ręcznie? – GolfWolf