问题描述
我正在编写一个比较属性的某个类的两个对象,以进一步列出差异。
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) {...}
});
在特殊情况下,newObj
或oldobj
可以为空。
我的问题是,在这种情况下:key.GetValue(null)
我遇到CS0120异常-“非静态方法需要目标”。
查看PropertyInfo选项(来自元数据):
public object? GetValue(object? obj);
我假设它可以处理对象为null
的情况,例如返回null
作为其值。
您能否解释一下这是否是该代码的正确行为,或者我在使用null时出错了? 在这种情况下,我可能会在ForEach进行一些验证(如果对象为空)并编写单独的比较代码来处理这种情况。
解决方法
您误解了传递给GetValue()
的参数的性质。
当您传递对象引用时,这意味着引用是对象实例上的实例属性。如果省略对象引用,则表示正在告诉反射api您正在尝试访问静态成员。