将基于 属性 名称和值的过滤器表达式转换为 Linq Where 子句 Func<T, bool>?
Convert a filter expression based on property name and value to Linq Where clause Func<T, bool>?
我想创建一个方法,该方法将根据 属性 名称和用户传递给我的方法的值来过滤我的数据。不幸的是,我无法更改代码使用的接口,我只是通过创建一种新的数据类型来扩展它 class。请看代码我的意思:
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);
}
}
数据CLASS:
public class MockDb{
public List<T> GetTable<T>(Func<T, bool> func){
return somecollection.Where(func).ToList();
}
}
如何将输入转换为过滤器,即将 fieldPath 和值转换为 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);
}
对于更通用和更复杂的解决方案,您应该按照 Jonathan Barclay 的建议使用 Expression。
我想创建一个方法,该方法将根据 属性 名称和用户传递给我的方法的值来过滤我的数据。不幸的是,我无法更改代码使用的接口,我只是通过创建一种新的数据类型来扩展它 class。请看代码我的意思:
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);
}
}
数据CLASS:
public class MockDb{
public List<T> GetTable<T>(Func<T, bool> func){
return somecollection.Where(func).ToList();
}
}
如何将输入转换为过滤器,即将 fieldPath 和值转换为 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);
}
对于更通用和更复杂的解决方案,您应该按照 Jonathan Barclay 的建议使用 Expression。