2009-07-14 20 views
7

In C#, si supponga di avere un oggetto (ad esempio, myObject) che è un'istanza della classe MyClass. Solo con myObject, come si accede a un membro statico di MyClass?C#: come si accede al membro statico di una classe, data un'istanza di quella classe?

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

Puoi spiegare perché non puoi fare riferimento più direttamente? C'è un po 'di odore di codice qui. –

+1

Il mio metodo accetta un parametro che è di tipo Block, ma l'argomento effettivo passato è di una classe che è di una delle diverse * sottoclassi * di Block e ciascuna sottoclasse deve avere la propria copia del membro statico (questo ruolo è stato giocato da "i" nel codice della mia domanda). – JaysonFix

+3

IMHO, molto spesso la migliore risposta a "Come faccio a fare questo?" è "Non farlo." Sospetto fortemente che questa sia una di quelle volte. – tnyfst

risposta

24

Dovreste usare riflessione:

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

mi piacerebbe in genere cerco di evitare di fare questo, però ... è molto fragile. Ecco un'alternativa utilizzando l'ereditarietà normale:

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

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

ecc

Poi si può solo utilizzare myObject.Value per ottenere il giusto valore.

+0

Con i dettagli pubblicati sembrerebbe più che possibile, dato che può semplicemente fare riferimento a MyClass.StaticMember Importa davvero solo se myObject potrebbe essere più di una classe e non è possibile sapere quale sviluppo. – Robert

+0

@Robert: Questa è esattamente la sua situazione però. Vedi i commenti alla domanda. –

+0

Ma dovrebbe essere statico. Sto affrontando anche questo problema. – mireazma

4

Devi semplicemente usare: MyClass.i

Elaborare un po ', al fine di utilizzare un membro statico, dovete sapere sulla classe. E avere un riferimento a un oggetto è irrilevante. L'unico modo in cui un oggetto avrebbe importanza è quando si dovrebbe avere 2 classi distinte che entrambi hanno un elemento in cerca identico:

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

Ma A.i e B.i sono completamente diversi campi, non v'è alcuna relazione logica tra loro. Anche se B eredita da A o viceversa.

+1

"using myObject only" ... – Joey

+0

Mi piacerebbe poter accedere al membro statico i utilizzando solo il riferimento myObject. – JaysonFix

+1

Johannes, l'ho letto, ma non penso che sia una vera (istic) domanda. –

10

Se hai il controllo di MyClass e devi farlo spesso, aggiungerei una proprietà membro che ti dia accesso.

class MyClass 
{ 
    private static int _i = 123; 

    public virtual int I => _i; 
} 
Problemi correlati