【发布时间】:2013-07-23 18:31:22
【问题描述】:
投票结束我的问题
我发现了一个类似的问题和一个非常有用的答案
ExpressionVisitor类(链接: How can I convert a lambda-expression between different (but compatible) models?)。 谢谢大家,我投票给我的答案因重复而关闭,也请考虑投票。
代码
我正在开发一个使用数据传输对象的存储库代码,如下面的代码。
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 的方法,该方法接受
Expression<Func<UsuarioDto, bool>>类型的参数。IUsuarioRepository 有一个名为 Select 的声明方法,该方法接受
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());
}
问题
-
Expression类型的 Update 方法是否像上面的代码一样工作? - 如果不起作用,有没有办法复制不同类型但具有相同基/接口属性的表达式?
非常感谢!
【问题讨论】: