2009-07-14 26 views
7

C# 'da, (myObject) bir nesneye sahip olduğunuzu varsayalım, yani MyClass sınıfının bir örneğidir. Yalnızca myObject'u kullanarak, MyClass statik üyesine nasıl erişirsiniz? Genellikle olsa bunu önlemek için çalışacaktıC# - Bu sınıfın bir örneği verildiğinde bir sınıfın statik üyesine nasıl erişilir?

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

çok kırılgan ...:

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

Neden daha doğrudan başvuruda bulunamadığınızı açıklayabilir misiniz? Burada biraz kod kokusu var. –

+1

Benim yöntemim, Block türünde bir parametre alır, ancak iletilen asıl argüman, bloğun birkaç * alt sınıfından * birine ait bir sınıftır ve her alt sınıfın, statik üyenin kendi kopyasına sahip olması gerekir (bu rol oynar Benim soru kodunda "i" ile). – JaysonFix

+3

IMHO, çoğu kez "Bunu nasıl yaparım?" "Bunu yapma." Bu zamanlardan biri olduğundan şüpheleniyorum. – tnyfst

cevap

24

Sen yansıması kullanmak gerekir. İşte, normal devralma kullanarak bir alternatiftir:

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

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

vb

Sonra sadece sağ değeri almak için myObject.Value kullanabilirsiniz. MyClass.i

Statik üyesi kullanmak için, sınıfın hakkında bilmek zorunda, biraz ayrıntılı için:

+0

Gönderilen detaylar ile sadece MyClass.StaticMember referans verebileceğinden dolayı öldürüldü. MyObject'in birden fazla Sınıf olması ve gelişmekte olanı bilmeniz gerçekten önemli. – Robert

+0

@Robert: Tam da onun durumu. Sorunun yorumlarını görün. –

+0

Ancak statik olması gerekiyordu. Ben de bu problemle yüzleşiyorum. – mireazma

4

Sadece kullanmak zorunda. Ve bir nesne referansına sahip olmak ilgisizdir. Her iki özdeş görünümlü üyeye sahip 2 farklı sınıfları olurdu zaman bir nesne olsun ki tek yolu:

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

Ama A.i ve B.i tamamen farklı alanlardır, aralarında mantıksal ilişki yoktur. B, A'dan mi yoksa tersi mi?

+1

"sadece myObject kullanarak" ... – Joey

+0

Sadece myObject referansını kullanarak statik üyeye i erişmek istiyorum. – JaysonFix

+1

Johannes, Bunu okudum, ama bunun gerçek (isteyerek) bir soru olduğunu düşünmeyin. –

10

Eğer MyClass'ın kontrolünü elinizde bulundurursanız ve bunu sık sık yapmanız gerekiyorsa, size erişim sağlayan bir üye mülk eklerim.

class MyClass 
{ 
    private static int _i = 123; 

    public virtual int I => _i; 
} 
İlgili konular