Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.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# 如何转换表达式<;Func<;基本类,bool>&燃气轮机;表达<;Func<;继承类,bool>>;?_C#_Inheritance_Expression - Fatal编程技术网

C# 如何转换表达式<;Func<;基本类,bool>&燃气轮机;表达<;Func<;继承类,bool>>;?

C# 如何转换表达式<;Func<;基本类,bool>&燃气轮机;表达<;Func<;继承类,bool>>;?,c#,inheritance,expression,C#,Inheritance,Expression,假设我有一个基类和继承类 public class BaseClass { public String SystemName { get; set; } public String UserName { get; set; } } internal class InheritedClass : BaseClass { public Guid Id { get; set; } } 基类上的某个表达式从外部传递到我的模块(继承的类从那里不可见) 表达式

假设我有一个基类和继承类

public class BaseClass
{
    public String SystemName { get; set; }
    public String UserName { get; set; }
}

internal class InheritedClass : BaseClass
{
    public Guid Id { get; set; }        
}
基类上的某个表达式从外部传递到我的模块(继承的类从那里不可见)

表达式
它描述了一些过滤逻辑,例如

Expression<Func<BaseClass, bool>> filter = x => x.SystemName.StartsWith("ABC") && x.UserName != ""
IQueryable<InheritedClass> filteredItems = Items.Where(filter);
Expression filter=x=>x.SystemName.StartsWith(“ABC”)和&x.UserName!=""
但在我的模块中,我需要使用

Expression<Func<InheritedClass, bool>>
表达式
因为我将此筛选器应用于IQueryable,如下所示

Expression<Func<BaseClass, bool>> filter = x => x.SystemName.StartsWith("ABC") && x.UserName != ""
IQueryable<InheritedClass> filteredItems = Items.Where(filter);
IQueryable filteredItems=Items.Where(filter);
继承的类具有基类的所有属性-所以我的经验不太丰富,假设转换是可能的:)

有没有办法将传递的表达式转换为我需要的

谢谢。

使用此实用程序类

public static class Utility
{
    //public static IEnumerable<TTarget> Where<TSource, TTarget>(this IEnumerable<TSource> source, Expression<Func<TSource, bool>> predicate) where TTarget : class, TSource
    //{
    //     return source.Where(obj => obj is TTarget).Where(predicate.Compile()).Select(obj => obj as TTarget);
    //}

    public static IQueryable<TTarget> Where<TSource, TTarget>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate) where TTarget : class, TSource
    {
        return source.Where(obj => obj is TTarget).Where(predicate).Select(obj => obj as TTarget);
    }
}
使用该实用程序并对其进行测试

            /*List of Persons*/
            List<Person> persons = new List<Person>()
                                                          {
                                                              new Student(){StudentId = "Std-01", Name = "Roy", Age = 24},
                                                              new Student(){StudentId = "Std-02", Name = "Jhon", Age = 25},
                                                              new Teacher(){TeacherId = "Tch-01", Name = "Roy", Age = 24},
                                                              new Teacher(){TeacherId = "Tch-02", Name = "Jhon", Age = 25}
                                                          };
            /*predictions*/
            Expression<Func<Person, bool>> prediction = x => x.Name.Contains("o");


            /*Use the utility*/
                                                                    /*Get Teacher from Persons*/
            IQueryable<Teacher> filteredItems = persons.AsQueryable().Where<Person, Teacher>(prediction);
            List<Teacher> result = filteredItems.ToList();
/*人员名单*/
名单人员=新名单()
{
新学生(){StudentId=“Std-01”,Name=“Roy”,年龄=24},
新学生(){StudentId=“Std-02”,Name=“Jhon”,年龄=25},
新教师(){TeacherId=“Tch-01”,Name=“Roy”,年龄=24},
新教师(){TeacherId=“Tch-02”,Name=“Jhon”,年龄=25}
};
/*预言*/
表达式prediction=x=>x.Name.Contains(“o”);
/*使用该实用程序*/
/*从人那里得到老师*/
IQueryable filteredItems=persons.AsQueryable()。其中(预测);
列表结果=filteredItems.ToList();
结果,我们将得到教师ID=“Tch-01”和“Tch-02”的教师


尽管我使用的是IEnumerable而不是IQueryable,但我希望它能对我有所帮助。不知道正确的搜索短语:)它很可能是出于某种原因应用于IQueryable,原因通常是表达式被翻译成SQL或类似的语言,所以调用compile可能会违背intention@RuneFS:我认为其意图是使用提供的表达式从列表中获取列表,因此制作了这样的示例。但是,似乎主要的过程要求将表达式转换为表达式,因为误解而非常抱歉。是的,我的观点是,在问题中明确指出它是Iqueryable“因为我将此过滤器应用于Iqueryable,就像这样”现在我的问题是,您将提供表达式,并且Iqueryable,我想买一台IQueryable。我是否遗漏了一些不是问题的东西,但这似乎是一个毫无意义的讨论。问题已经结束,因为它已经被回答了,我们正在辩论一个与已经回答的问题相符的答案