我正在尝试将 lambda 表达式中的参数类型从一种类型替换为另一种类型。
我在 stackoverflow 上找到了其他答案,即这个答案,但我没有运气。
想象一下,您有一个域对象和一个可以从中检索域对象的存储库。
但是存储库必须处理自己的数据传输对象,然后映射并返回域对象:
ColorDto.cs
public class DtoColour {
public DtoColour(string name)
{
Name = name;
}
public string Name { get; set; }
}
域颜色.cs
public class DomainColour {
public DomainColour(string name)
{
Name = name;
}
public string Name { get; set; }
}
存储库.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 是数据传输对象的集合。
我曾尝试使用 anExpressionVisitor
来执行此操作,但无法弄清楚如何在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:没有为类型“ColourDto”定义属性“System.String Name”
希望有人可以提供帮助。
编辑:这是一个dotnetfiddle
还是不行。
编辑:这是一个工作dotnetfiddle
谢谢伊莱·阿贝尔