C# 如何比较FieldInfo';什么是实例的价值?
永远不会返回“是”C# 如何比较FieldInfo';什么是实例的价值?,c#,.net,reflection,fieldinfo,C#,.net,Reflection,Fieldinfo,永远不会返回“是” 编辑:事先不知道类型是什么。因此,我不能使用:(bool)field.GetValue(instance1)来比较类型为值类型的任何字段的装箱值。每次装箱一个值时,它都会创建一个新对象,因此==永远不会这样工作。改用object.Equals: public partial class Form1 : Form { public Form1() { InitializeComponent(); myClass
编辑:事先不知道类型是什么。因此,我不能使用:
(bool)field.GetValue(instance1)
来比较类型为值类型的任何字段的装箱值。每次装箱一个值时,它都会创建一个新对象,因此==
永远不会这样工作。改用object.Equals
:
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;
}
(这里使用静态方法意味着即使值为
null
),它也会工作)您使用的==
,它将比较类型为值类型的任何字段的装箱值。每次装箱一个值时,它都会创建一个新对象,因此==
永远不会这样工作。改用object.Equals
:
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;
}
(这里使用静态方法意味着即使值为
null
),它也会工作)您正在比较FieldInfo.GetValue返回的两个对象的地址,由于内存中的地址不同,=
永远不会为真
尝试用以下内容替换(如果
):
foreach (FieldInfo field in fields)
{
if (object.Equals(field.GetValue(instance2), field.GetValue(instance1))
{
Text = "Yes";
}
}
您正在比较FieldInfo.GetValue返回的两个对象的地址
,由于内存中的地址不同,因此=
永远不会为真
尝试用以下内容替换(如果
):
foreach (FieldInfo field in fields)
{
if (object.Equals(field.GetValue(instance2), field.GetValue(instance1))
{
Text = "Yes";
}
}
由于field.GetValue(instance1)返回值的“装箱”(对象)版本,因此调用==
,您只是在比较两个不同的引用
请尝试呼叫:
if (field.GetValue(instance2).Equals(field.GetValue(instance1)))
由于field.GetValue(instance1)返回值的“装箱”(对象)版本,因此调用==
,您只是在比较两个不同的引用
请尝试呼叫:
if (field.GetValue(instance2).Equals(field.GetValue(instance1)))
+谢谢。但是我不理解你对静态方法的评论。你的意思是与field.GetValue(instance2).Equals(field.GetValue(instance1))
相反吗?@ispiro:Yes-如果field.GetValue(instance2)
返回null,则会抛出NullReferenceException
,而静态方法不会。+谢谢。但是我不理解你对静态方法的评论。你的意思是与field.GetValue(instance2).Equals(field.GetValue(instance1))
相反吗?@ispiro:Yes-如果field.GetValue(instance2)
返回null,则会抛出NullReferenceException
,而静态方法不会。正如Jon上面所建议的,最好使用object.Equals以避免第一个FieldInfo.GetValue返回null时出现问题。正如Jon上面所建议的,最好使用object.Equals以避免第一个FieldInfo.GetValue返回null时出现问题。