2016-04-09 31 views
1

olarak ayarlayın. Birden fazla sınıf içeren bir programım var. temel düzeni aşağıdaki gibidir:C# - Sınıfta yer alan özel alanı

public class Foo2 
{ 
    public string junk1 = "bleh"; // Not useful 
} 

public class Foo1 : Foo2 
{ 
    private int num = 2; // I want to access this 
    private string junk2 = "yo"; 
} 

public class Foo : Foo1 
{ 
    public string junk3 = "no"; 
} 

Şimdi başka aşağıdaki gibi ben vardır: çalıştığım çalıştı yöntemlerden

public class access // I used Reflection 
{ 
    private Foo2 test = new Foo(); // The only thing important here is that test is Foo2 

    private void try1() // This was my frist attempt(It didn't work) 
    { 
     Foo tst = (Foo)test; 
     tst.GetType().GetField("num", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(tst, 5); 
    } 

    private void try2() // Second attempt also didn't work 
    { 
     Foo1 tst = (Foo1)test; 
     tst.GetType().GetField("num", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(tst, 5); 
    } 
} 

Hiçbiri.

Oh yardım ve bunu türetilmiş alan num yok bu yüzden Foo1 veya Foo elde edilmemiş ise not defteri

Teşekkür

+2

Bu şekilde yayınlayamazsınız, kodunuz '(Foo) 'ya da' (Foo1) testine' InvalidCastException 'atar. – thehennyy

+0

Bir Foo2 örneği oluşturdunuz. Bu sınıf num adında bir üye içermiyor. Bu alana yazmanın kesinlikle hiçbir yolu yoktur. Ayrıca yansıma yardımcı olmaz. –

+0

Sadece bu alana söz konusu başlık gibi türetilmiş bir sınıfta erişmek isterseniz (kodunuz türetilmiş sınıfta erişmeye çalışmaz) alanınıza erişimi kontrol eden korumalı bir özelliği uygulayarak normal OOP yolunu kullanın. Bu durumda yansımaya ihtiyacınız yok. –

cevap

1

Foo2 kullanmak zorunda kodunda herhangi bir yanlış yazım için özür ediniz. İşte bu, dönem.

typeof(Foo1).GetField("num", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(test, 5); 
:

Ve özel alanlar beri

Foo1 test = new Foo1(); 

test.GetType().GetField("num", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(test, 5); 
son durumda doğru türde kullanmak gerekir, türe özel şunlardır: tst Foo1 işe yarardı ise

+0

Test yaptığım zaman Foo1 test edildiğinde aynı şekilde geri döndü Foo, Foo'dan işleri başarıyla değiştirdim ve işe yaradı ama bu Foo1'de ilk kez denedim ve başarısız oldu – EliteInfinity

+0

Belki de örnek kodunuz yanlış, ama bu asla bu şekilde çalışmayacaksın. 'Test', 'Foo' veya 'Foo1' ise ancak Foo2 değil ise çalışır. –

+0

Ben sadece tam olarak kontrol edeyim, belki size bir şey olarak .Net framework 2.0 kullanıyorum ama – EliteInfinity