C# 抽象类中的静态方法

C# 抽象类中的静态方法,c#,C#,我知道类似的问题在这里已经被问得够多了,但我已经寻找了一段时间来解决我的问题 我正在构建一个应用程序,有三个单独的类,分别是“团队”、“经理”和“员工”。我意识到我在为这三个类重复很多代码,所以我定义了一个名为“Worker”的抽象类 在每个类上,我都定义了一个GetAllX方法,该方法返回和IEnumerable,例如: public static IEnumerable<Manager> GetAllManagers() { //Code to get all manag

我知道类似的问题在这里已经被问得够多了,但我已经寻找了一段时间来解决我的问题

我正在构建一个应用程序,有三个单独的类,分别是“团队”、“经理”和“员工”。我意识到我在为这三个类重复很多代码,所以我定义了一个名为“Worker”的抽象类

在每个类上,我都定义了一个
GetAllX
方法,该方法返回和
IEnumerable
,例如:

public static IEnumerable<Manager> GetAllManagers()
{
    //Code to get all managers
    yield return m
    //find next manager and loop
}
公共静态IEnumerable GetAllManager()
{
//获取所有经理的代码
收益率
//找到下一个管理器并循环
}

我想要的是能够在我的抽象类中定义一个名为
GetAll
的方法,该方法将返回类型为T的IEnumerable,其中T是从我的抽象类继承的类。有什么办法可以实现这样的目标吗

从技术上讲,你可以

abstract class Worker
{
    public static IEnumerable<T> GetAll<T>() where T : Worker
    {
        //your code
    }
}

class Manager : Worker
{
}

class Employee : Worker
{
}
抽象类工作者
{
公共静态IEnumerable GetAll(),其中T:Worker
{
//你的代码
}
}
班级经理:工人
{
}
员工类别:工人
{
}
这个方法调用
var managers=Worker.GetAll()


另一种方法是使用不同的静态变量,OP想要的是注释中描述的

abstract class Worker<T> where T : Worker<T>
{
    protected static string name;

    public static IEnumerable<T> GetAll() 
    {
        Console.WriteLine(name);
        return Enumerable.Empty<T>();
    }
}

class Manager : Worker<Manager>
{
    static Manager()
    {
        name = "Manager";
    }
}

class Employee : Worker<Employee>
{
    static Employee()
    {
        name = "Employee";
    }
}
抽象类Worker,其中T:Worker
{
受保护的静态字符串名称;
公共静态IEnumerable GetAll()
{
Console.WriteLine(名称);
返回可枚举的.Empty();
}
}
班级经理:工人
{
静态管理器()
{
name=“经理”;
}
}
员工类别:工人
{
静态雇员()
{
name=“Employee”;
}
}
和使用

//create object to call static constructors
//this need only once for every concrete class
var test = new Manager();
var test1 = new Employee();

var managers = Worker<Manager>.GetAll();
var employees = Worker<Employee>.GetAll();
//创建对象以调用静态构造函数
//每个混凝土类只需要一次
var test=新管理器();
var test1=新员工();
var managers=Worker.GetAll();
var employees=Worker.GetAll();


从技术上讲,您可以做到这一点,但在我看来,经典存储库是更合适的方法。

有时我很遗憾堆栈溢出不会接受“否”作为完整的注释。忘记静态废话,创建抽象的
GetAll
,并实现它。为什么名为Manager的类会有一个名为GetAllMangers的方法?您混合了太多内容,需要GetAll()作为某个对象的实例方法。如果
Manager
的所有实例都存储在名为(例如)
InstanceCollector
的类的实例中,则可以为
Manager
提供一个
InstanceCollector
的静态单例实例,然后单例实例将具有通用的GetAll()方法。这并不完美,但比复制/粘贴整个
GetAll*
方法三次更干净。GetAll似乎应该在Team类中实现。团队应该有一个定义为List Workers或类似内容的属性。对员工和经理实施IWorker。就这样,这真是太接近了!我希望能够在需要调用的每个类中定义一个静态变量,并且能够在实际运行的查询中使用该静态变量。使用这种方法,我可以打开
typeof(T)
,它包含在我喜欢的worker类中,我只编写了一个单独的静态类,其中包含三个单独命名的方法,因为它没有那么多代码可复制。谢谢你!“我可以打开(T)
类型”-请不要这样做,这听起来好像你没有按你应该的方式使用类!