可以通过实例和类访问的可覆盖属性

时间:2014-10-17 23:34:51

标签: c# static

我有一个包含许多不同类的继承树。这些类中的每一个都有一些我需要不时访问的静态属性。有时我需要特定类的属性,有时我需要特定类的属性,而某些多态实例的结果却是。

这比较简单,比如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);
}

我想要这样的东西,它确实有效。

2 个答案:

答案 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"; }
    }
}