2016-08-25 9 views
5

私は最近、C#に関するインタビューを受けました。そのうちの1つに私は答えを見つけることができません。私はクラスを与えられた インタビューの謎:私的なデータメンバーへのアクセス

は、次のようになります。メインクラスが与えられました。また

public class Stick 
{ 
    private int m_iLength; 
    public int Length 
    { 
     get 
     { 
      return m_iLength; 
     } 
     set 
     { 
      if (value > 0) 
      { 
       m_iLength = value; 
      } 
     } 
    } 
} 

static void Main(string[] args) 
{ 
    Stick stick = new Stick(); 
} 

タスクがでm_iLengthの原因となり、主にコードを追加しましたネガティブになるようにクラスをスティックします(そして、それができることを強調しました)。

私は何かを見逃しているようです。データメンバはプライベートであり、getとset関数がint型の値であることを知る限り、これはどのように行うことができません。

+3

おそらく? – slawekwin

+5

例:@stackoverflow.com/questions/10862747/access-private-fields – bobah75

+1

@Sayse in C#クラスメンバーが「仮想」と宣言されていない限り、クラスメンバーをオーバーライドすることはできません。リフレクションは私が見ることができる唯一の方法です(基になるILを変更するのは不十分です。または、安全でないコードを使ってメモリバッキングのiLengthを変更することはできません)。 –

答えて

4

反射が最も直接的常にある:

var type = typeof(Stick); 
var field = type.GetField("m_iLength", BindingFlags.NonPublic |BindingFlags.GetField | BindingFlags.Instance); 
field.SetValue(stick, -1); 
Console.WriteLine(stick.Length); 

説明:

最初の行がStickためTypeオブジェクトを取得し、私たちは、後にプライベートフィールドを取得することができます。

2行目は、名前で設定したいフィールドを取得します。バインディングフラグが必要です。はnullになります。

3行目では、フィールドに負の値が与えられます。

関連する問題