Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.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# 将基于属性名称和值的筛选器表达式转换为Linq Where子句Func<;T、 bool>;?_C#_Linq_Lambda_Expression_Func - Fatal编程技术网

C# 将基于属性名称和值的筛选器表达式转换为Linq Where子句Func<;T、 bool>;?

C# 将基于属性名称和值的筛选器表达式转换为Linq Where子句Func<;T、 bool>;?,c#,linq,lambda,expression,func,C#,Linq,Lambda,Expression,Func,我想创建一个方法,该方法将根据用户传递给我的方法的属性名和值过滤我的数据。不幸的是,我无法更改代码使用的接口,我只是通过创建一种新类型的数据类来扩展它。请参见代码我的意思: public interface IService{ Task<IEnumerable<T>> GetCollection<T>(string name, string fieldPath, string value) } public class MockService : I

我想创建一个方法,该方法将根据用户传递给我的方法的属性名和值过滤我的数据。不幸的是,我无法更改代码使用的接口,我只是通过创建一种新类型的数据类来扩展它。请参见代码我的意思:

public interface IService{
     Task<IEnumerable<T>> GetCollection<T>(string name, string fieldPath, string value)
}
public class MockService : IService
{
        MockDb _db = new Mock();
        public async Task<IEnumerable<T>> GetCollection<T>(string fieldPath, string value)
        {
            Func<T, bool> func = <WHAT CODE IS REQUIRED HERE BASED ON THE FIELD PATH AND VALUE?>;
            return _db.GetTable<T>(func);
        }
}
公共接口iSeries设备{
任务GetCollection(字符串名称、字符串字段路径、字符串值)
}
公共类MockService:iSeries
{
MockDb_db=new Mock();
公共异步任务GetCollection(字符串字段路径,字符串值)
{
Func Func=;
返回_db.GetTable(func);
}
}
数据类:

public class MockDb{
       public List<T> GetTable<T>(Func<T, bool> func){
            return somecollection.Where(func).ToList();
       }
}
公共类MockDb{
公共列表可获取(Func Func){
返回somecollection.Where(func.ToList();
}
}

如何将输入转换为筛选器,即fieldPath和value转换为Func?

这里有一个简单的方法,假设fieldPath是属性的名称,值是字符串类型:

 public async Task<IEnumerable<T>> GetCollection<T>(string fieldPath, string value)
 {
        return _db.GetTable<T>(t=> ((string) t.GetType().GetProperty(fieldPath).GetValue(t)) == value);
 }
公共异步任务GetCollection(字符串字段路径,字符串值) { 返回_db.GetTable(t=>((字符串)t.GetType().GetProperty(fieldPath.GetValue(t))==value); }
对于更通用和更复杂的解决方案,您应该按照Jonathan Barclay的建议使用表达式。

似乎您正在使用实体框架,在这种情况下,您应该使用可转换为SQL的
表达式。表达式可以动态构建;这里可以找到一个例子:本例中没有,但我以前使用过表达式。这只是一个静态对象的模拟数据库。不过,非常感谢。对
字符串的转换是不必要的;您可以只使用
Equals
t=>t.GetType().GetProperty(fieldPath).GetValue(t).Equals(value)