如何在调用基类的静态函数

时间:2016-08-15 10:28:19

标签: c# generics static static-methods derived-class

我有以下课程:

class Base<T> where T : Base<T>
{
    protected static string Source;

    public static List<T> Read()
    {
        return GetResource(Source);
    }
}

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

通用参数不能有静态成员,所以我不能从那里拿走它。

我尝试在派生类的静态构造函数中设置 Source ,但只有当我调用派生类而不是Base中的成员时才会调用它。

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

当我手动设置Source时,有可能已经调用 Read -Function,因此我必须设置 Source 在它被召唤之前。

我知道我可以将来源作为读取中的参数,但我希望读取在没有参数的情况下使用。

有没有什么方法可以确保在我的类的任何其他成员被调用之前Source被设置,以便任何依赖代码在里面派生类并且不必被任何人调用使用派生类? 我基本上希望它能像这样工作:

class Derived : Base<Derived>
{
    // somehow set Source
    Source = "This is my source";
}

class User
{
    private List<Derived> MyResources;

    public User()
    {
        MyResources = Derived.Read();
    }
 }

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

1 个答案:

答案 0 :(得分:0)

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

我将使用一个接口来强制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 - 方法,但对于我的方案而言并不是什么大不了的事。 此外,由于它在读取方法中创建了一个实例,因此这可能非常耗时,具体取决于派生的构造函数。在我的场景中,它只有标准的构造函数。

因此请谨慎使用。