2009-07-14 7 views
7

Angenommen, Sie haben in C# ein Objekt (z. B. myObject), das eine Instanz der Klasse MyClass ist. Verwenden Sie nur myObject, wie würden Sie auf ein statisches Element von MyClass zugreifen?C# - Wie kann man auf ein statisches Member einer Klasse zugreifen, wenn eine Instanz dieser Klasse angegeben wird?

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

Können Sie erklären, warum Sie nicht direkter darauf verweisen können? Hier riecht es ein wenig nach Code. –

+1

Meine Methode akzeptiert einen Parameter vom Typ Block, aber das übergebene tatsächliche Argument gehört zu einer Klasse, die einer von mehreren * Unterklassen * von Block angehört, und jede Unterklasse hat ihre eigene Kopie des statischen Mitglieds (diese Rolle wird gespielt) durch "i" im Code meiner Frage). – JaysonFix

+3

IMHO, oft die beste Antwort auf "Wie mache ich das?" ist "Tu das nicht." Ich vermute stark, dass dies eine dieser Zeiten ist. – tnyfst

Antwort

24

Du müss Reflexion verwenden:

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

ich in der Regel tun dies würde versuchen, obwohl zu vermeiden ... es ist sehr spröde. Hier ist eine alternative normale Vererbung:

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

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

usw.

Dann können Sie einfach myObject.Value verwenden den richtigen Wert zu erhalten.

+0

Mit den Details gepostet würde es über Kill scheinen, da er nur verweisen kann MyClass.StaticMember Es ist nur wirklich wichtig, wenn myObject mehr als eine Klasse sein kann und Sie nicht wissen, welche bei der Entwicklung. – Robert

+0

@Robert: Das ist aber genau seine Situation. Siehe die Kommentare zu der Frage. –

+0

Aber es sollte statisch sein. Ich stehe auch vor diesem Problem. – mireazma

4

Sie haben einfach zu verwenden: MyClass.i

ein wenig zu erarbeiten, um ein statisches Element zu verwenden, müssen Sie über die Klasse kennen. Und eine Objektreferenz zu haben ist irrelevant. Der einzige Weg wäre Materie ein Objekt ist, wenn man zwei verschiedene Klassen haben würde, die beide ein identisches suchen Mitglied haben:

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

Aber A.i und B.i sind ganz andere Felder, gibt es keine logische Beziehung zwischen ihnen. Auch wenn B von A erbt oder umgekehrt.

+1

"Nur mit myObject" ... – Joey

+0

Ich möchte nur unter Verwendung der Referenz myObject auf das statische Element i zugreifen können. – JaysonFix

+1

Johannes, ich habe das gelesen, aber glaube nicht, dass es eine echte (istische) Frage ist. –

10

Wenn Sie die Kontrolle über MyClass haben und dies oft tun müssen, würde ich eine Mitgliedseigenschaft hinzufügen, die Ihnen Zugriff gewährt.

class MyClass 
{ 
    private static int _i = 123; 

    public virtual int I => _i; 
}