如何将当前实例传递给实例内部的FieldInfo.GetValue?

How to pass the current instance to FieldInfo.GetValue inside the instance?

我正在制作一个摘要 class,我需要验证它的后代中的字段。所有经过验证的字段都由一个属性标记,并且应该检查是否为 null 或是否为空。为此,我获取了 class:

中的所有字段
var fields = this.GetType().GetFields().Where(field => Attribute.IsDefined(field, typeof(MyAttribute))).ToList(); 

然后,对于每个 FieldInfo,我都尝试这样做:

if (string.IsNullOrEmpty(field.GetValue(this).ToString()))
{
    // write down the name of the field
}

我收到 System.NullReferenceException: 对象引用未设置到对象的实例

我知道 I am suppose to pass the instance of a class GetValue 方法。但是如何传递当前实例(启动逻辑的实例)?

或者:是否有其他获取字段值的方法?

GetValue 调用正常。问题在于您调用 ToString.

的 return 值

如果 GetValue returns null,那么 ToString 将在这个 null 值上调用,这将抛出 NullReferenceException.

改为执行以下操作:

var value = field.GetValue(this);
if (value == null || string.IsNullOrEmpty(value.ToString()))
{
    // write down the name of the field
}

正如 Lucas 所说,问题在于您不应该调用 ToString()。大概你的属性应该只应用于字符串字段,所以最简单的方法就是将结果转换为 string。如果该转换失败,则表明存在更大的错误(属性应用不正确)。

if (string.IsNullOrEmpty((string) field.GetValue(this)))