我有一个包含许多不同类的继承树。这些类中的每一个都有一些我需要不时访问的静态属性。有时我需要特定类的属性,有时我需要特定类的属性,而某些多态实例的结果却是。
这比较简单,比如Java(我认为)。只需制作一堆静态字段(可以覆盖它们吗?我不确定)。但是在C#中,非静态字段只能通过实例访问(自然),静态字段只能通过相应的类访问(不自然)。
并且,你不能通过,呃,静态“重载”。如果一个类有静态和非静态Foo
,那么instance.Foo
会失败,因为编译器不清楚你指的是哪个Foo
,即使你指的是不可能的静止的,因为它被禁止了。
好的,我会提供一些代码。说我有这个:
class Base
{
public static readonly string Property = "Base";
}
class Child1 : Base
{
public static readonly new string Property = "Child 1";
}
class Child2 : Base
{
public static readonly new string Property = "Child 2";
}
然后,某处:
public void SomeMethod(Base instance)
{
System.Console.WriteLine(instance.Property); // This doesn't work.
}
以及其他地方:
public void SomeOtherMethod()
{
System.Console.WriteLine(Child2.Property);
}
我想要这样的东西,它确实有效。
答案 0 :(得分:1)
作为Peter Duniho said,可以使用反射来完成。
例如,可以在基类:
中定义public const string Property = "Base";
public virtual string InstanceProperty
{
get
{
return (string)this.GetType()
.GetField("Property", BindingFlags.Public | BindingFlags.Static)
.GetValue(null);
}
}
然后每个派生类只需使用Property
关键字重新定义new
。
答案 1 :(得分:0)
我认为你在C#中做的最好的事情是这样的:
public class BaseClass
{
public virtual string InstanceProperty
{
get { return StaticProperty; }
}
public static string StaticProperty
{
get { return "BaseClass"; }
}
}
public class Derived1Base : BaseClass
{
public override string InstanceProperty
{
get { return StaticProperty; }
}
public new static string StaticProperty
{
get { return "Derived1Base"; }
}
}
public class Derived1Derived1Base : Derived1Base
{
}
public class Derived2Base : BaseClass
{
public override string InstanceProperty
{
get { return StaticProperty; }
}
public new static string StaticProperty
{
get { return "Derived2Base"; }
}
}