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

时间:2015-01-28 10:30:21

标签: c# nullreferenceexception system.reflection

我正在制作一个抽象类,我需要验证其后代中的字段。所有经过验证的字段都由一个属性标记,并且假设要检查空值或为空。为此,我得到了班上的所有字段:

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:对象引用没有设置为对象的实例

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

或者:还有另一种获得该领域价值的方法吗?

2 个答案:

答案 0 :(得分:2)

GetValue电话没问题。问题在于您调用ToString的返回值。

如果GetValue返回null,则会在此ToString值上调用null,这会抛出NullReferenceException

做这样的事情:

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

答案 1 :(得分:2)

正如卢卡斯所说,当你不应该问题时,问题将是ToString()。大概你的属性应该只应用于字符串字段,所以最简单的方法就是将结果转换为string。如果该转换失败,则表示更大的错误(该属性未正确应用)。

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