有没有办法将Func <T1,bool>映射到Func <T2,bool>?

实验室实验室

所以,我想知道是否有可能在c#中做下一件事:

我有一个数据库模型-可以说是Car

public class Car {
  public string Id {get;set;}
  public string Name {get;set}
}

并为此类型提供一个DbSet someDbContext

public DbSet<Car> Cars {get;set;}

而且我还有一个 CarDto

public class CarDto {
  public string Id {get;set;}
  public string Name {get;set}
}

结果我们得到了这样的东西:

var select = new Func<CarDto, bool>(car => car.Name == "BMW");

// And somehow use this expression for other type Car
someDbContext.Cars.Where(select);

也许有一种方法可以Funcs像这样映射它们

var newFunc = mapper.Map<Func<Car, bool>>(select);

有什么想法吗?

广州7

如果您只想处理重写属性访问,则可以使用ExpressionVisitor如下所示的:

public class Program
{
    public static void Main()
    {
        Expression<Func<Car, bool>> expr = x => x.Name == "BMW";
        var replaced = ReplaceParameter<CarDto>(expr);
    }

    private static Expression<Func<T, bool>> ReplaceParameter<T>(LambdaExpression expr)
    {
        if (expr.Parameters.Count != 1)
            throw new ArgumentException("Expected 1 parameter", nameof(expr));

        var newParameter = Expression.Parameter(typeof(T), expr.Parameters[0].Name);
        var visitor = new ParameterReplaceVisitor()
        {
            Target = expr.Parameters[0],
            Replacement = newParameter,
        };
        var rewrittenBody = visitor.Visit(expr.Body);
        return Expression.Lambda<Func<T, bool>>(rewrittenBody, newParameter);
    }
}

public class ParameterReplaceVisitor : ExpressionVisitor
{
    public ParameterExpression Target { get; set; }
    public ParameterExpression Replacement { get; set; }

    protected override Expression VisitMember(MemberExpression node)
    {
        if (node.Expression == this.Target)
        {
            // Try and find a property with the same name on the target type
            var members = this.Replacement.Type.GetMember(node.Member.Name, node.Member.MemberType, BindingFlags.Public | BindingFlags.Instance);
            if (members.Length != 1)
            {
                throw new ArgumentException($"Unable to find a single member {node.Member.Name} of type {node.Member.MemberType} on {this.Target.Type}");
            }
            return Expression.MakeMemberAccess(this.Replacement, members[0]);
        }

        return base.VisitMember(node);
    }
}

我们需要将其解构LambdaExpression为其主体和参数。我们需要创建一个具有正确类型的新参数,并用新参数替换旧参数的所有用法。这是访问者进入的地方:只要看到您访问旧参数上的成员,它就会尝试查找新参数上的相应成员,然后访问该成员。

然后LambdaExpression我们使用重写的正文和新参数构造一个new

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将Expression <Func <T,bool >>转换为Expression <Func <T1,bool >>,以便T是T1的成员

来自分类Dev

将MemberInfo反射到Func <T1,T2>

来自分类Dev

将Expression <Func <T1 >>转换为Expression <Func <T1,T2 >>

来自分类Dev

如何将委托`Func<T1, Func<T2, Task<TResult>>>` 转换为`Func<T1, Task<Func<T2, TResult>>`?

来自分类Dev

调用Func <T1,T2,T3>有哪些可选参数?

来自分类Dev

无法理解如何编码Func <Func <T1,T2>,T3>

来自分类Dev

无法从 `Expression<Func<T1, T2>>` 转换为 `Expression<Func<object, object>>`

来自分类Dev

表达式<Func <T1,T2,TResult >>和Sql IN

来自分类Dev

我无法通过func <T1,T2>获得C#方法名称

来自分类Dev

如何将PowerShell函数传递给采用Func <T1,T2>的.NET方法?

来自分类Dev

有没有一种方法可以获取Func <T,bool>的类型?

来自分类Dev

是否可以为Func <T1,T2,....>参数的某些部分提供xml注释以实现智能感知?

来自分类常见问题

有没有办法将输入从案例1到案例2在Java中?

来自分类Dev

有没有办法将 2 个数据库字段映射到 JPA 中的自定义对象?

来自分类Dev

将 T1 中当前不在 T2 中的所有行插入到 T2

来自分类Dev

方法重载中的 Expression<Func<T,bool>> 与 Func<T,bool>

来自分类Dev

Func <T,bool>的逻辑逆

来自分类Dev

有没有办法将复选框与Nullable Bool属性一起使用

来自分类Dev

如果T1和T2拥有std :: pair <T1,T2>不应该具有琐碎的默认构造函数?

来自分类Dev

有没有办法让Swashbuckle将OData参数添加到Web API 2 IQueryable <T>端点?

来自分类Dev

如何将IList <T1>分配给IList <T2>,其中T1是T2的子类型?

来自分类Dev

如何将IList <T1>分配给IList <T2>,其中T1是T2的子类型?

来自分类Dev

有没有办法让“make_unique<T[]>”可以将参数转发给T的构造函数?

来自分类Dev

从Expression <Func <T,bool >>实体框架返回所有实体

来自分类Dev

有没有办法使用Nullable Bool属性的复选框

来自分类Dev

有没有办法将命令映射到键盘以在Windows中打开程序或文件?

来自分类Dev

有没有办法将端口映射到应用程序或服务?

来自分类Dev

有没有办法将 twilio 调用映射到接收调用的 webhook?

来自分类Dev

有没有办法在没有额外分配的情况下将std :: vector <const T *>转换为std :: vector <T *>?

Related 相关文章

  1. 1

    将Expression <Func <T,bool >>转换为Expression <Func <T1,bool >>,以便T是T1的成员

  2. 2

    将MemberInfo反射到Func <T1,T2>

  3. 3

    将Expression <Func <T1 >>转换为Expression <Func <T1,T2 >>

  4. 4

    如何将委托`Func<T1, Func<T2, Task<TResult>>>` 转换为`Func<T1, Task<Func<T2, TResult>>`?

  5. 5

    调用Func <T1,T2,T3>有哪些可选参数?

  6. 6

    无法理解如何编码Func <Func <T1,T2>,T3>

  7. 7

    无法从 `Expression<Func<T1, T2>>` 转换为 `Expression<Func<object, object>>`

  8. 8

    表达式<Func <T1,T2,TResult >>和Sql IN

  9. 9

    我无法通过func <T1,T2>获得C#方法名称

  10. 10

    如何将PowerShell函数传递给采用Func <T1,T2>的.NET方法?

  11. 11

    有没有一种方法可以获取Func <T,bool>的类型?

  12. 12

    是否可以为Func <T1,T2,....>参数的某些部分提供xml注释以实现智能感知?

  13. 13

    有没有办法将输入从案例1到案例2在Java中?

  14. 14

    有没有办法将 2 个数据库字段映射到 JPA 中的自定义对象?

  15. 15

    将 T1 中当前不在 T2 中的所有行插入到 T2

  16. 16

    方法重载中的 Expression<Func<T,bool>> 与 Func<T,bool>

  17. 17

    Func <T,bool>的逻辑逆

  18. 18

    有没有办法将复选框与Nullable Bool属性一起使用

  19. 19

    如果T1和T2拥有std :: pair <T1,T2>不应该具有琐碎的默认构造函数?

  20. 20

    有没有办法让Swashbuckle将OData参数添加到Web API 2 IQueryable <T>端点?

  21. 21

    如何将IList <T1>分配给IList <T2>,其中T1是T2的子类型?

  22. 22

    如何将IList <T1>分配给IList <T2>,其中T1是T2的子类型?

  23. 23

    有没有办法让“make_unique<T[]>”可以将参数转发给T的构造函数?

  24. 24

    从Expression <Func <T,bool >>实体框架返回所有实体

  25. 25

    有没有办法使用Nullable Bool属性的复选框

  26. 26

    有没有办法将命令映射到键盘以在Windows中打开程序或文件?

  27. 27

    有没有办法将端口映射到应用程序或服务?

  28. 28

    有没有办法将 twilio 调用映射到接收调用的 webhook?

  29. 29

    有没有办法在没有额外分配的情况下将std :: vector <const T *>转换为std :: vector <T *>?

热门标签

归档