2016-04-09 12 views
1

私は複数のクラスを含むプログラムを持っていますので、互いに継承しています。基本的なレイアウトは次のようになります。c# - 継承クラスのプライベートフィールドを設定

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"; 
} 

を今すぐ別に続かないように私が持っている:私は働いてみたメソッドの

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); 
    } 
} 

なし。

ああを助け、私はそれが派生フィールドnumを持っていないので、Foo1またはFooから派生していないメモ帳に

おかげ

+2

あなたはそのようにキャストできません。あなたのコードは '(Foo)test'または'(Foo1)test'で 'InvalidCastException'を投げます。 – thehennyy

+0

Foo2のインスタンスを作成しました。そのクラスにはnumというメンバーが含まれていません。そのフィールドに書き込む方法は全くありません。また、反省は役に立たない。 –

+0

フィールドのアクセスを制御する保護されたプロパティを実装することによって、通常のOOP方法を使用して、派生クラスのこのフィールドにアクセスしたいだけです(コードは派生クラスでアクセスしようとしません)。その場合、あなたは反射を必要としません。 –

答えて

1

Foo2を使用していたコード内の任意の間違ったスペルを気の毒にしてください。それが、期間です。

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

とプライベートフィールド以来

Foo1 test = new Foo1(); 

test.GetType().GetField("num", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(test, 5); 
が最後のケースでは、あなたが正しい型を使用する必要があり、型固有です:あなた tstFoo1それが働いているだろうしている場合

+0

私はテストをしたときにFoo1ですが、テストしたときと同じようにFoo、Fooから正常に変更しましたが、動作しましたが、初めてFoo1で試して失敗しました – EliteInfinity

+0

サンプルコードが間違っているかもしれませんこのように決して働かないでください。 'test'が' Foo'でも 'Foo1'でも' Foo2'ではなくても動作します。 –

+0

私はちょうどそれがちょうどそれが私があなたに言っている場合、おそらくそれが役立つかもしれないことをダブルチェックしました。.Netフレームワーク2.0を団結させていますが、それは何の効果も持つだろうと思っています – EliteInfinity

関連する問題