C# - 在给定该类的实例的情况下,如何访问类的静态成员?

Jay*_*Fix 9 c# static gettype

在C#中,假设您有一个对象(比方说myObject),它是一个类的实例MyClass.myObject仅使用,您将如何访问静态成员MyClass

class MyClass
    {
    public static int i = 123 ;
    }

class MainClass
    {
    public static void Main()
        {
        MyClass myObject = new MyClass() ;
        myObject.GetType().i = 456 ; //  something like this is desired,
                         //  but erroneous
        }
    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 25

你必须使用反射:

Type type = myObject.GetType();
FieldInfo field = type.GetField("i", BindingFlags.Public |
                                     BindingFlags.Static);
int value = (int) field.GetValue(null);
Run Code Online (Sandbox Code Playgroud)

我通常会尽量避免这样做......它非常脆弱.这是使用普通继承的替代方法:

public class MyClass
{
    public virtual int Value { get { return 10; } }
}

public class MyOtherClass : MyClass
{
    public override int Value { get { return 20; } }
}
Run Code Online (Sandbox Code Playgroud)

等等

然后你可以myObject.Value用来获得正确的价值.

  • @mireazma:然后根据我的回答,您要么需要使用反射,要么引入一个在每个子类中被覆盖的虚拟实例成员。.NET 的类型系统根本没有您正在寻找的那种“静态多态性”。 (2认同)

Lou*_*nco 10

如果你有MyClass的控制权并且需要经常这样做,我会添加一个可以访问的成员属性.

class MyClass
{
    private static int _i = 123;

    public virtual int I => _i;
}
Run Code Online (Sandbox Code Playgroud)


Hen*_*man 5

您只需要使用: MyClass.i

详细说明一下,为了使用静态成员,您必须了解该类。拥有对象引用是无关紧要的。对象重要的唯一方式是当您拥有两个具有相同外观成员的不同类时:

class A { public static int i; }
class B { public static int i; }
Run Code Online (Sandbox Code Playgroud)

但是A.iB.i是完全不同的领域,它们之间没有逻辑关系。即使 B 从 A 继承,反之亦然。