2012-02-13 69 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 2012-02-13 23:31:52

+0

@ispiro:是的 - 如果'field.GetValue(instance2)'返回null,那麼會拋出'NullReferenceException',而靜態方法則不會。 – 2012-02-13 23:33:53

+0

Thanks。 – ispiro 2012-02-13 23:35:26

0

你比較address通過FieldInfo.GetValue,自返回的兩個對象在內存中的這些地址是不同的,==永遠不會是真的。

嘗試用這種替代if

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

作爲喬恩上面提出的建議,最好使用object.Equals來避免第一個FieldInfo.GetValue返回null時的問題。 – 2012-02-13 23:32:55

0

因爲field.GetValue(INSTANCE1)返回值的「盒裝」(對象)版本,因此調用==你只比較兩個不同的引用。

會轉而呼籲:

field.GetValue(instance2).Equals(field.GetValue(instance1))