PropertyInfo.GetValuenull-应该如何表现?

问题描述

我正在编写一个比较属性的某个类的两个对象,以进一步列出差异。

Class oldobj,newObj;
//some initiation of above

Class classObject = new Class();
var objectKeys = classObject .GetType().GetProperties().ToList();
objectKeys.ForEach(key => {
    var prevIoUskeyvalue = key.GetValue(oldobj);
    var newkeyvalue = key.GetValue(newObj);
    if (!Equals) {...}
});

在特殊情况下,newObjoldobj可以为空。

我的问题是,在这种情况下:key.GetValue(null)我遇到CS0120异常-“非静态方法需要目标”。

查看PropertyInfo选项(来自元数据):

public object? GetValue(object? obj);

我假设它可以处理对象为null的情况,例如返回null作为其值。

您能否解释一下这是否是该代码的正确行为,或者我在使用null时出错了? 在这种情况下,我可能会在ForEach进行一些验证(如果对象为空)并编写单独的比较代码来处理这种情况。

解决方法

您误解了传递给GetValue()的参数的性质。

当您传递对象引用时,这意味着引用是对象实例上的实例属性。如果省略对象引用,则表示正在告诉反射api您正在尝试访问静态成员。