Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有一种方法可以在C中定义隐式运算符,它定义从表达式到所选类的转换_C#_.net_Casting_Expression_Operator Keyword - Fatal编程技术网

C# 有没有一种方法可以在C中定义隐式运算符,它定义从表达式到所选类的转换

C# 有没有一种方法可以在C中定义隐式运算符,它定义从表达式到所选类的转换,c#,.net,casting,expression,operator-keyword,C#,.net,Casting,Expression,Operator Keyword,我正在尝试实现定义过滤器的类,以便在将其作为参数传递给存储库类EF中的方法时使其更显式 我对从表达式到类的隐式运算符的定义有一个问题。 是否可以在fd4变量附近实现语法 public class FilterDefinition<TEntity> where TEntity : class { public FilterDefinition() { } public FilterDefinition(Expression<Func<TEntity

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

我对从表达式到类的隐式运算符的定义有一个问题。 是否可以在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();
    }

简而言之,答案不在这个场景中,因为从语法上讲,在fd4中,实际上并不是从表达式[…]转换为您的类型。编译器不知道lambda代表一个表达式[…],直到它知道它试图对该值做什么;lambda x=>x.SomeBool可以解释为匿名方法的多种表达式树类型和委托类型,这里的编译器不会理解您的意思是将lambda视为表达式,然后使用隐式转换运算符将表达式更改为FilterDefinition。它根本不能,也不会做出这样的飞跃。您可以接近,就像您的fd3示例一样,但是。。。我的很大一部分都想知道FilterDefinition在这里到底做了什么,因为对于外部观察者来说,它似乎并没有在原始表达式树上添加任何内容。

简单的答案不在这个场景中,因为从语法上讲,在fd4中,您实际上并没有从表达式[…]转换到您的类型。编译器不知道lambda代表一个表达式[…],直到它知道它试图对该值做什么;lambda x=>x.SomeBool可以解释为匿名方法的多种表达式树类型和委托类型,这里的编译器不会理解您的意思是将lambda视为表达式,然后使用隐式转换运算符将表达式更改为FilterDefinition。它根本不能,也不会做出这样的飞跃。您可以接近,就像您的fd3示例一样,但是。。。我很想知道FilterDefinition在这里到底做了什么,因为对于外部观察者来说,它似乎并没有在原始表达式树上添加任何内容。

请将代码作为文本而不是图像发布。不,我认为这是不可能的。这可能是一个XY问题。什么是FilterDefinition?您不能这样做,原因与您不能将lambda分配给变量的原因相同。请参阅,和。请将代码作为文本而不是图像发布。不,我认为这是不可能的。这可能是一个XY问题。FilterDefinition到底是做什么的?您不能这样做,原因与您不能将lambda分配给变量的原因相同。请参阅,和。FilterDefinition类的目的是作为参数传递给查询的通用存储库。FilterDefinition类的目的是作为参数传递给查询的通用存储库。并使用继承定义常用的过滤器。