我正在尝试将 lambda 表达式中的参数类型从一种类型替换为另一种类型。
我在 stackoverflow 上找到了其他答案,即this one https://stackoverflow.com/questions/11159697/replace-parameter-in-lambda-expression但我对他们没有什么好运气。
想象一下,您有一个域对象和一个可以从中检索域对象的存储库。
然而,存储库必须处理自己的数据传输对象,然后映射并返回域对象:
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();
}
}
正如您所看到的,这将不起作用,因为谓词适用于域模型,而存储库内的集合是数据传输对象的集合。
我尝试过使用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”类型定义
希望有人能帮忙。
编辑:这是一个点网小提琴 https://dotnetfiddle.net/LQ6XE9
还是不行。
编辑:这是一个工作点网小提琴 https://dotnetfiddle.net/HlZgPX
Thanks 伊莱·阿贝尔 https://stackoverflow.com/users/276083/eli-arbel