2012-02-13 2 views
1
public partial class Form1 : Form 
{   
    public Form1() 
    { 
     InitializeComponent(); 

     myClass instance1 = new myClass(); 
     myClass instance2 = new myClass(); 
     FieldInfo[] fields = typeof(myClass).GetFields(); 
     foreach (FieldInfo field in fields) if (field.GetValue(instance2) == field.GetValue(instance1)) Text = "Yes";   
    } 
} 

class myClass 
{ 
    public bool b = false; 
    public int i = 2; 
} 

「はい」を返しません。FieldInfoのインスタンスの値を比較するにはどうすればよいですか?

編集:を事前に知っていません。だから私は持っていけない:(bool)field.GetValue(instance1)

答えて

6

あなたは==を使用しています。これは、タイプが値タイプのフィールドのボックス化された値を比較します。値が囲まれる度に新しいオブジェクトが作成されるので、==はそのようには決して動作しません。代わりにobject.Equalsを使用してください:

foreach (FieldInfo field in fields) 
{ 
    if (object.Equals(field.GetValue(instance2), field.GetValue(instance1)) 
    { 
     Text = "Yes"; 
    } 
} 

(ここでは、静的メソッドを使用して、値がnullであっても、それがうまくいくことを意味する。)

+0

+1感謝を。しかし、私は静的メソッドについてのあなたのコメントを理解していません。 'field.GetValue(instance2).Equals(field.GetValue(instance1))'とは反対の意味ですか? – ispiro

+0

@ispiro:はい。 'field.GetValue(instance2)'がnullを返した場合、 'NullReferenceException'がスローされますが、静的メソッドは返されません。 –

+0

ありがとう。 – ispiro

0

あなたはFieldInfo.GetValueによって返された二つのオブジェクトのaddressを比較して以来されていますメモリ内のそれらのアドレスが異なる場合、==は決して真ではありません。

はこれでifを交換してください:

if (field.GetValue(instance2).Equals(field.GetValue(instance1))) 
+0

を使用するための+1は、上記で推奨されているように、オブジェクトを使用することをお勧めします。最初のFieldInfo.GetValueがnullを返すときの問題。 –

0

field.GetValue値の「箱入り」(オブジェクト)のバージョンを返します(インスタンス1)は、それゆえあなたは2つのだけ異なる参照を比較している==を呼び出しているので。

呼び出す代わりに試してみてください。

field.GetValue(instance2).Equals(field.GetValue(instance1)) 
関連する問題