如何比较 FieldInfo 实例的值?

发布于 2025-01-04 20:35:27 字数 578 浏览 0 评论 0原文

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;
}

永远不会返回“是”。

编辑:没有事先知道类型是什么。所以我不能有:(bool)field.GetValue(instance1)

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;
}

Never returns "Yes".

EDIT: Without knowing beforehand what the types will be. So I can't have: (bool)field.GetValue(instance1).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

谎言 2025-01-11 20:35:27

您正在使用 ==,它将比较类型为值类型的任何字段的装箱值。每次装箱一个值时,它都会创建一个新对象,因此 == 永远不会像那样工作。使用 object.Equals 来代替:(

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

这里使用静态方法意味着即使值为 null 它也能工作。)

You're using ==, which will be comparing the boxed values for any field where the type is a value type. Each time a value is boxed, it will create a new object, so == will never work like that. Use object.Equals instead:

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

(Using the static method here means it'll work even if the values are null.)

太阳男子 2025-01-11 20:35:27

您正在比较 FieldInfo.GetValue 返回的两个对象的地址,并且由于内存中的这些地址不同,因此 == 永远不会成立。

尝试用以下内容替换 if

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

you are comparing the address of the two objects returned by FieldInfo.GetValue and since those addresses in memory are different, the == is never true.

try replacing the if with this:

if (field.GetValue(instance2).Equals(field.GetValue(instance1)))
所有深爱都是秘密 2025-01-11 20:35:27

因为 field.GetValue(instance1) 返回值的“装箱”(对象)版本,因此调用 == 您只是比较两个不同的引用。

尝试改为调用:

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

Because field.GetValue(instance1) returns a "boxed" (object) version of the value, hence calling == you are only comparing two different references.

Try instead calling:

field.GetValue(instance2).Equals(field.GetValue(instance1))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文