我正在制作一个抽象类,我需要验证其后代中的字段。所有经过验证的字段都由一个属性标记,并且假设要检查空值或为空。为此,我得到了班上的所有字段:
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。但是如何传递当前实例(启动逻辑的实例)?
或者:还有另一种获得该领域价值的方法吗?
答案 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)))