如何将当前实例传递给实例内部的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)))
我正在制作一个摘要 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
.
如果 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)))