有没有办法将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 条评论
登录 后参与评论

相关文章

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

将MemberInfo反射到Func <T1,T2>

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

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

如何将Expression <Func <TEntity,bool >>映射到Expression <Func <TDbEntity,bool >>

C#将Func <T1,object>转换为Func <T1,T2>

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

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

有没有办法将名称不同的环境变量映射到IOptions <T>实现模式?

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

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

C#6重载分辨率Func <T1>和Func <T2>

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

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

有没有办法在python中打印not bool?

此<[T1,T2,T2]>语法在TypeScript中有什么作用?

如果将类作为 <T> 发送,有没有办法获取类的方法?

Hibernate-有没有办法将2列与1列连接?

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

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

C#Func <T,bool>与Expression <Func <T,bool >>

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

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

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

“ t1 .__ index = t2”和“ setmetatable(t1,{__index = t2})”之间有什么区别?

将Expression <Func <T,bool >>与bool进行比较

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

有没有办法将元素列表映射到字典而没有循环?

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