Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何比较FieldInfo';什么是实例的价值?_C#_.net_Reflection_Fieldinfo - Fatal编程技术网

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时出现问题。