C# 依赖于子类的静态方法?

C# 依赖于子类的静态方法?,c#,abstract-class,C#,Abstract Class,如何使静态方法的行为依赖于调用它的类? 例如 请注意,如果我在Base.GetClassName中使用MethodBase.GetCurrentMethod().DeclaringType.Name,则返回“Base” 还要注意的是,这类似于其他几个SO问题,如下面的问题,但我以更简洁的方式提问,以记录除“你不能”之外的答案: 关键是添加类型参数: abstract class Base<T> where T : Base<T> { public

如何使静态方法的行为依赖于调用它的类? 例如

请注意,如果我在
Base.GetClassName
中使用
MethodBase.GetCurrentMethod().DeclaringType.Name
,则返回“Base”

还要注意的是,这类似于其他几个SO问题,如下面的问题,但我以更简洁的方式提问,以记录除“你不能”之外的答案:


关键是添加类型参数:

abstract class Base<T>
    where T : Base<T>
{
    public static string GetClassName()
    {
        return typeof(T).Name;
    }
}

class A : Base<A> { }

class B : Base<B> { }
在这种情况下,在
Base
/
A
Base
/
B
中存在不同的静态


然而,所有这些都要付出代价。在上面的示例中,
Base
的子类不可能访问相同的静态对象,而所有子类都事先不知道彼此。例如,
B
无法访问与
A
相同的
对象。一种可能的解决方法是在希望所有子类共享值时使用
Base.values

可能重复@JasonWatkins。感谢您标记为dup。我本应该那样做的
abstract class Base<T>
    where T : Base<T>
{
    public static string GetClassName()
    {
        return typeof(T).Name;
    }
}

class A : Base<A> { }

class B : Base<B> { }
abstract class Base<T>
where T : Base<T>
{
    private static HashSet<string> values = new HashSet<string>();

    internal Base(string value)
    {
        if (Base<T>.values.Contains(value))
            throw new Exception("Not unique");
        else
            Base<T>.values.Add(value);
    }

    public static string GetClassName()
    {
        return typeof(T).Name;
    }

    public static IEnumerable<string> GetValues()
    {
        return new LinkedList<string>(Base<T>.values);
    }
}

class A : Base<A>
{
    public A(string value) : base(value) { }
}

class B : Base<B>
{
    public B(string value) : base(value) { }
}

static void Main(string[] args)
{
    var a1 = new A("value");
    var a2 = new A("value 2");
    // var a3 = new A("value"); // Would throw an exception
    var b = new B("value"); // Does not throw an exception

    Console.WriteLine(A.GetClassName()); // Prints "A"
    Console.WriteLine(B.GetClassName()); // Prints "B"

    Console.WriteLine("The values in A:");
    foreach (var value in A.GetValues()) // This loop prints "value" and "value 2"
    {
        Console.WriteLine("\t" + value);
    }
    Console.WriteLine("The values in B:");
    foreach (var value in B.GetValues()) // This loop prints "value"
    {
        Console.WriteLine("\t" + value);
    }
}