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);
}
}