C # - как получить доступ к статическому члену класса, учитывая экземпляр этого класса? - PullRequest
8 голосов
/ 14 июля 2009

В 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
        }
    }

Ответы [ 3 ]

25 голосов
/ 14 июля 2009

Вы должны использовать отражение:

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

Я бы вообще старался избегать этого, хотя ... это очень хрупко. Вот альтернатива, использующая нормальное наследование:

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

public class MyOtherClass : MyClass
{
    public override int Value { get { return 20; } }
}

и т.д.

Тогда вы можете просто использовать myObject.Value, чтобы получить правильное значение.

10 голосов
/ 14 июля 2009

Если у вас есть контроль над MyClass и вам нужно делать это часто, я бы добавил свойство члена, которое дает вам доступ.

class MyClass
{
    private static int _i = 123;

    public virtual int I => _i;
}
4 голосов
/ 14 июля 2009

Вы просто должны использовать: MyClass.i

Чтобы немного уточнить, чтобы использовать статический член, вы должны знать о классе. И наличие ссылки на объект не имеет значения. Единственный способ, которым объект будет иметь значение, - это когда у вас будет 2 разных класса, каждый из которых имеет идентичный элемент:

class A { public static int i; }
class B { public static int i; }

Но A.i и B.i - это совершенно разные поля, между ними нет логической связи. Даже если B наследует от A или наоборот.

...