gpt4 book ai didi

c# - 动态确定调用哪个静态方法

转载 作者:太空宇宙 更新时间:2023-11-03 14:23:36 26 4
gpt4 key购买 nike

在我的领域模型中,我有一个基本实体类,所有类都派生自该类。
我希望能够根据当前用户的权限动态创建过滤器。
例如-对于 Employee 类,我会定义员工可以看到他自己和他所在的部门。
我的方法是这样的:

 public static IQueryable<Employee> CreateLinqFilter(IQueryable<Employee> query, User user)
{
return query.Where(e => e.Id == user.Id || e.Department.Manager.Id == user.Id);
}

然后,在我的存储库基类中,我想动态确定类型并调用正确的 CreateLinqFilter 方法:

protected IQueryable CreateLinq<T>(User user)
{
var query = Session.Linq<T>();
Type t = typeof(T);
//if not an entity- do not perform filter
if (!t.IsAssignableFrom(typeof(Entity)))
{
return query;
}
//now we know that T is a sub-class of Entity.
return CreateLinqFilter<T>(query,user);
}

protected IQueryable CreateLinqFilter<T>(IQueryable<T> query, User user)
//the following line won't compile:
//where T: Entity
{
//i'd like to be able to do:
//T.CreateFilter(query);

//instead, I have to do this?
if (typeof(T) == Employee)
{
return Employee.CreateLinqFilter(query,user);
}
if (typeof(T) == Department)
{
return Department.CreateLinqFilter(query,user);
}
//etc...
}

到目前为止我得到的唯一解决方案是大量的 if-else block ,这非常难看。
谁有更好的主意?
谢谢
强尼

最佳答案

尝试这样的事情:

return (IQueryable)typeof(T).GetMethod("CreateLinqFilter").Invoke(null, new object[]{query, user});

这使用反射在运行时查找方法;如果这太慢,您可能需要考虑在某处缓存 GetMethod 的结果。请注意,此方法不限于静态方法;将 null 替换为指向类型 T 的对象的指针,您也可以在普通实例方法上使用它。

有关更多信息,请咨询 MSDN documentation for the reflection classes ;你可以在 documentation for Invoke 中找到一个很好的例子.

关于c# - 动态确定调用哪个静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4680280/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com