是否可以建立一个 Func 的集合
Is it possible to build a collection of Func
我正在尝试设置一组动态过滤器以在运行时注入我的 ORM 对象(每个实体类型一个)所以我希望做这样的事情:
Filters = new List<Action>
{
(Foo f) => ...,
(Bar b) => ...,
(Goo g) => ...,
};
然后当用户做类似的事情时:
var tSet = db.GetAll<T>().Where(...).ToArray();
我会像这样实现 GetAll():
public IQueryable<T> GetAll<T>() where T : class
{
using var db = Connection.Open();
var filter = Filters.FirstOrDefault(f => f.GetType() == typeof(Func<T, bool>)) as Func<T, bool>;
return (FiltersEnabled && filter != null) ? db.Select<T>().Where(filter) : db.Select<T>();
}
是否可以通过某种方式存储 List<Func<variousT, bool>>
,因为我似乎无法做到这一点?
我一直在尝试将其声明为:
protected ICollection<object> Filters = new List<object>();
但这行不通,显然我不能使用 Action
委托,因为签名不同。
由于您所有的代表都是不同的类型,您需要声明集合以包含它们的 base 类型:Delegate
:
List<Delegate> filters = new List<Delegate>
{
(Func<int, bool>)(i => i > 0),
(Func<string, bool>)(s => s.Length > 0)
};
需要显式转换为 Func
,因为编译器无法自动将 lambda 表达式转换为 Delegate
。
我正在尝试设置一组动态过滤器以在运行时注入我的 ORM 对象(每个实体类型一个)所以我希望做这样的事情:
Filters = new List<Action>
{
(Foo f) => ...,
(Bar b) => ...,
(Goo g) => ...,
};
然后当用户做类似的事情时:
var tSet = db.GetAll<T>().Where(...).ToArray();
我会像这样实现 GetAll():
public IQueryable<T> GetAll<T>() where T : class
{
using var db = Connection.Open();
var filter = Filters.FirstOrDefault(f => f.GetType() == typeof(Func<T, bool>)) as Func<T, bool>;
return (FiltersEnabled && filter != null) ? db.Select<T>().Where(filter) : db.Select<T>();
}
是否可以通过某种方式存储 List<Func<variousT, bool>>
,因为我似乎无法做到这一点?
我一直在尝试将其声明为:
protected ICollection<object> Filters = new List<object>();
但这行不通,显然我不能使用 Action
委托,因为签名不同。
由于您所有的代表都是不同的类型,您需要声明集合以包含它们的 base 类型:Delegate
:
List<Delegate> filters = new List<Delegate>
{
(Func<int, bool>)(i => i > 0),
(Func<string, bool>)(s => s.Length > 0)
};
需要显式转换为 Func
,因为编译器无法自动将 lambda 表达式转换为 Delegate
。