投票结束我的问题
我使用
ExpressionVisitor
类找到了一个类似的问题和一个非常有用的答案(链接: 如何在不同(但兼容)模型之间转换 lambda 表达式?)。谢谢大家,我投票给我的答案因重复而关闭,也请考虑投票。
代码
我正在开发一个使用数据传输对象的存储库代码,如下面的代码。
public class UsuarioRepositorio : IUsuarioRepository
{
private readonly MongoRepository<UsuarioDto> _Repository;
public UsuarioRepository(string connectionString)
{
_Repositorio = new MongoRepository<UsuarioDto>(connectionString, "");
}
}
public interface IUsuarioRepository
{
IEnumerable<T> Select(Expression<Func<Usuario, bool>> predicate);
}
UsuarioDto是Usuario类的数据传输对象,都继承自接口IUsuario。
UsuarioRepository实现了IUsuarioRepository接口,有一个私有成员叫_Repository,属于该类型。
MongoRepository<UsuarioDto>
_Repository成员有一个名为Select的方法,它接受 type 的参数。
Expression<Func<UsuarioDto, bool>>
IUsuarioRepository有一个名为Select的声明方法,该方法接受 type 的参数
Expression<Func<Usuario, bool>>
。
问题
问题是我需要在UsuarioRepository中实现Select方法,使用IUsuarioRepository方法签名并向_Repository传递一个新的类型表达式,具有相同的参数参数。Expression<Func<UsuarioDto, bool>>
Expression<Func<Usuario, bool>>
基本上我需要一种将表达式参数复制到不同类型的新表达式的方法,知道表达式具有相同的属性,因为它们具有相同的接口继承。像这样的东西:
public IEnumerable<Usuario> Select(Expression<Func<Usuario, bool>> predicate)
{
Expression<Func<UsuarioDto, bool>> transferExpression = x => x != null;
transferExpression = transferExpression .Update(predicate.Body, predicate.Parameters);
return _Repository.Select(transferExpression ).ToList().Select(x => x.ToDomain());
}
问题
- 类型的Update方法
Expression
是否像上面的代码一样工作? - 如果它不起作用,有没有办法复制不同类型的表达式,但具有相同的基本/接口属性?
非常感谢!