2009-07-14 3 views
7

В C# предположим, что у вас есть объект (скажем, myObject), который является экземпляром класса MyClass. Использование только myObject, как бы вы получили доступ к статическому элементу MyClass?C# - как получить доступ к статическому члену класса, учитывая экземпляр этого класса?

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 
     } 
    } 
+6

Не могли бы вы объяснить, почему вы не можете ссылаться на него более конкретно? Здесь немного запаха кода. –

+1

Мой метод принимает параметр, который имеет тип Block, но фактический переданный аргумент относится к классу, который относится к одному из нескольких * подклассов * блока, и каждый подкласс должен иметь свою собственную копию статического члена (эта роль была сыграна «i» в коде моего вопроса). – JaysonFix

+3

IMHO, нередко лучший ответ на вопрос «Как мне это сделать?» «Не делай этого». Я сильно подозреваю, что это один из тех времен. – tnyfst

ответ

24

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

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, чтобы получить правильное значение.

+0

С подробностями, размещенными, это казалось бы более убитым, так как он может просто ссылаться на MyClass.StaticMember Это действительно имеет значение, если myObject может быть более одного класса, и вы не можете знать, что при разработке. – Robert

+0

@Robert: Это его ситуация. См. Комментарии к вопросу. –

+0

Но он должен быть статичным. Я тоже столкнулся с этой проблемой. – mireazma

4

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

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

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

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

+1

«using myObject only» ... – Joey

+0

Я хочу иметь доступ к статическому элементу i, используя ссылку myObject, только. – JaysonFix

+1

Йоханнес, я читал это, но не думаю, что это реальный (итический) вопрос. –

10

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

class MyClass 
{ 
    private static int _i = 123; 

    public virtual int I => _i; 
} 
Смежные вопросы