C# 动态确定要调用的静态方法

C# 动态确定要调用的静态方法,c#,static,introspection,C#,Static,Introspection,在我的域模型中,我有一个基本实体类,所有类都从该实体类派生。 我希望能够根据当前用户的权限动态创建筛选器。 例如,对于Employee类,我将定义员工可以看到自己和他的部门。 我的方法如下: public static IQueryable<Employee> CreateLinqFilter(IQueryable<Employee> query, User user) { return query.Where(e => e.Id == u

在我的域模型中,我有一个基本实体类,所有类都从该实体类派生。
我希望能够根据当前用户的权限动态创建筛选器。
例如,对于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);
    }
公共静态IQueryable CreateLinqFilter(IQueryable查询,用户)
{
返回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...
    }
受保护的IQueryable CreateLinq(用户)
{
var query=Session.Linq();
类型t=类型(t);
//如果不是实体-不执行筛选
如果(!t.IsAssignableFrom(typeof(Entity)))
{
返回查询;
}
//现在我们知道T是实体的一个子类。
返回CreateLinqFilter(查询,用户);
}
受保护的IQueryable CreateLinqFilter(IQueryable查询,用户)
//无法编译以下行:
//其中T:实体
{
//我希望能够做到:
//T.CreateFilter(查询);
//相反,我必须这样做?
if(类型(T)=员工)
{
返回Employee.CreateLinqFilter(查询,用户);
}
if(类型(T)=部门)
{
返回部门.CreateLinqFilter(查询,用户);
}
//等等。。。
}
到目前为止,我得到的唯一解决方案是大量if-else块,它们非常难看。
有谁有更好的主意吗?
谢谢
约翰尼

尝试以下方法:

return (IQueryable)typeof(T).GetMethod("CreateLinqFilter").Invoke(null, new object[]{query, user});
这使用反射在运行时查找方法;如果这太慢,您可能想考虑缓存<代码> GETMease<代码>的结果。注意,此方法不限于静态方法;将null替换为指向T类型对象的指针,您也可以在普通实例方法上使用它


有关更多信息,请咨询;在c#4.0中,您可以在中找到一个很好的例子。

在c#4.0中,您可以使用动态a=T,如果不是,也许您只能使用第一个答案。

好的,首先,不要使用很多if..else块,使用一个开关。

真正好的解决方案,IMO只是在派生存储库类中调用该方法,而不是在基本存储库中调用。那么您就没有问题了,因为派生类知道它在查询什么,所以EmployeesRespository将显式调用Employee.GetFilter。

我几乎肯定在这里遗漏了一些东西,但为什么不声明一个“CreateLinqFilter”在您的实体类上,而不是所有这些再感染类型的东西,或者如果语句不能调用“entity.CreateLinqFilter,它会在正确的情况下调用它?正如我所说,我可能错过了一些东西,我想知道什么@Chris由于CreateLinqFilter函数在实体集合上工作,因此在单个实体的上下文中它是毫无意义的;函数实际上是静态的……啊,是的,这很有意义。我偶尔还是很难理解泛型以及它们需要在哪里生存嗯,没有人喜欢反思,但它确实有效,目前看来这是最好的答案。谢谢