【发布时间】:2023-04-05 05:39:02
【问题描述】:
我正在尝试将 lambda 表达式中的参数类型从一种类型替换为另一种类型。
我在 stackoverflow 上找到了其他答案,即this one,但我没有找到他们的运气。
想象一下,您有一个域对象和一个可以从中检索域对象的存储库。
但是存储库必须处理自己的数据传输对象,然后映射和返回域对象:
ColorDto.cs
public class DtoColour {
public DtoColour(string name)
{
Name = name;
}
public string Name { get; set; }
}
DomainColour.cs
public class DomainColour {
public DomainColour(string name)
{
Name = name;
}
public string Name { get; set; }
}
Repository.cs
public class ColourRepository {
...
public IEnumerable<DomainColour> GetWhere(Expression<Func<DomainColour, bool>> predicate)
{
// Context.Colours is of type ColourDto
return Context.Colours.Where(predicate).Map().ToList();
}
}
正如您所见,这不起作用,因为谓词用于域模型,并且存储库中的 Collection 是数据传输对象的集合。
我尝试使用ExpressionVisitor 来执行此操作,但无法弄清楚如何仅更改ParameterExpression 的类型而不会引发异常,例如:
测试场景
public class ColourRepository {
...
public IEnumerable<DomainColour> GetWhere(Expression<Func<DomainColour, bool>> predicate)
{
var visitor = new MyExpressionVisitor();
var newPredicate = visitor.Visit(predicate) as Expression<Func<ColourDto, bool>>;
return Context.Colours.Where(newPredicate.Complie()).Map().ToList();
}
}
public class MyExpressionVisitor : ExpressionVisitor
{
protected override Expression VisitParameter(ParameterExpression node)
{
return Expression.Parameter(typeof(ColourDto), node.Name);
}
}
最后是例外:
System.ArgumentException:属性“System.String Name”不是 为“ColorDto”类型定义
希望有人能提供帮助。
编辑:这是dotnetfiddle
还是不行。
编辑:这是一个有效的dotnetfiddle
【问题讨论】:
标签: c# lambda expressionvisitor