【问题标题】:Is there a way to define implicit operator in C# that defines cast from Expression to selected class有没有办法在 C# 中定义隐式运算符,定义从表达式到选定类的强制转换
【发布时间】:2020-02-14 07:15:13
【问题描述】:

我正在尝试实现定义过滤器的类,以便在将其作为参数传递给我的存储库类 (EF) 中的方法时使其更加明确。

我对从 Expression 到我的类的隐式运算符的定义有疑问。 是否可以实现 fd4 变量附近的语法?

public class FilterDefinition<TEntity>
    where TEntity : class
{
    public FilterDefinition() { }

    public FilterDefinition(Expression<Func<TEntity, bool>> filter)
    {
        this.Filter = filter;
    }

    public virtual Expression<Func<TEntity, bool>> Filter { get; set; }

    public static implicit operator FilterDefinition<TEntity>(Expression<Func<TEntity, bool>> filter) => new FilterDefinition<TEntity>(filter);
}

public class SomeEntity
{
    public bool SomeBool { get; set; }
}

class Program
{
    static void Main()
    {
        FilterDefinition<SomeEntity> fd1 = new FilterDefinition<SomeEntity>(x => x.SomeBool);
        FilterDefinition<SomeEntity> fd2 = new FilterDefinition<SomeEntity> { Filter = x => x.SomeBool };
        FilterDefinition<SomeEntity> fd3 = (Expression<Func<SomeEntity, bool>>)(x => x.SomeBool);
        //FilterDefinition<SomeEntity> fd4 = x => x.SomeBool;

        Console.ReadKey();
    }
}

FilterDefinition 类的目的是作为参数传递给通用查询存储库。并使用继承定义常用的过滤器。

public class Repository<TEntity> : IRepository<TEntity>
    where TEntity : class
{
    private readonly DbSet<TEntity> dbSet;

    public Repository(DbContext context)
    {
        this.dbSet = context.Set<TEntity>();
    }

    public async Task<IEnumerable<TEntity>> GetAsync(
        FilterDefinition<TEntity> filter = null,
        OrderDefinition<TEntity> order = null,
        PagingDefinition paging = null)
    {
        return await new QueryBuilder<TEntity>(this.dbSet)
            .ApplyFilter(filter)
            .ApplyOrder(order)
            .ApplyPaging(paging)
            .ToQuery()
            .ToListAsync();
    }

【问题讨论】:

标签: c# .net casting expression operator-keyword


【解决方案1】:

简短的回答是“不在这种情况下”,因为在语法上,在fd4 中,您实际上并没有从Expression[...] 转换为您的类型。编译器不知道 lambda 表示 Expression[...],直到它知道它试图用该值 do 做什么; lambda (x =&gt; x.SomeBool) 可以解释为表达式树类型 委托类型(对于匿名方法)的宽范围,这里的编译器不会理解您的意思是“将 lambda 视为 Expression&lt;Func&lt;SomeEntity, bool&gt;&gt;,然后使用隐式转换运算符将表达式更改为 FilterDefinition”。它根本不能(也不会)实现这一飞跃。您可以接近,就像您的 fd3 示例一样,但是...我的很大一部分人想知道 FilterDefinition 在这里实际上做什么,因为对于外部观察者来说,它看起来并不真正在原始表达式树上添加任何内容。

【讨论】:

  • FilterDefinition 类的目的是作为参数传递给通用查询存储库。并使用继承定义常用的过滤器。
猜你喜欢
  • 2010-11-21
  • 2017-08-26
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
  • 2014-08-30
相关资源
最近更新 更多