如何在调用基类的静态函数之前设置派生的静态成员?

本文关键字:设置 派生 静态成员 静态函数 调用 基类 | 更新日期: 2023-09-27 18:02:22

我有以下类:

class Base<T> where T : Base<T>
{
    protected static string Source;
    public static List<T> Read()
    {
        return GetResource(Source);
    }
}

我希望这个类作为基类的功能,但每个派生类必须有一个不同的。我的问题是,我不能保证在调用Read之前设置了Source。我知道我可以询问源是否在GetResource被调用之前设置,但这不是重点。我需要在调用类的任何静态成员之前设置它。

泛型形参不能有静态成员,所以我不能从静态成员中取出它。

我尝试在派生类的静态构造函数中设置,但这只会在我调用派生类而不是基类中的成员时被调用。

我尝试在静态Base构造函数中使用一个可重写的方法,但是这样的方法也必须是静态的,并且静态方法不能被覆盖。

当我手动设置Source时,有可能Read-Function已经被调用,所以我必须在Source被调用之前设置

我知道我可以给Source作为Read的参数,但我希望Read不带参数使用。

是否有任何方法可以确保在调用类的任何其他成员之前设置源,以便任何依赖代码在派生类中,而不必由使用派生类的任何人调用?

我想让它像这样工作:

class Derived : Base<Derived>
{
    // somehow set Source
    Source = "This is my source";
}
class User
{
    private List<Derived> MyResources;
    public User()
    {
        MyResources = Derived.Read();
    }
 }

注意:源基本上是一个SQL语句,所以一个属性或类似的东西是不够的,我认为

如何在调用基类的静态函数之前设置派生的静态成员?

好了,我找到答案了。它不像我希望的那么漂亮,但这是我能想出的最好的了。

我将使用一个接口来强制T的实例具有提供我的源的特定方法。

interface ISource
{
    string GetSource();
}

然后在我的基类中实现它,如下所示:

class Base<T> where T : Base<T>, ISource, new()
{
    public static List<T> Read()
    {
        // here I create an Instance to be able to call the Methods of T
        string source = (new T()).GetSource();
        return GetResource(source);
    }
}

派生类:

class Derived : Base<Derived>, ISource
{
    public string GetSource()
    {
        return "This specific source";
    }
}

用法如下:

class User
{
    public User()
    {
        List<Derived> myResources = Derived.Read();
    }
}
这当然会导致派生的每个实例都具有GetSource-方法,但对于我的场景来说这不是什么大问题。此外,由于它在Read-方法中创建了一个实例,这可能会耗费时间,具体取决于Derived的构造函数。在我的场景中,它只有标准构造函数。

请谨慎使用。