我有类似于以下代码的东西,它使用反射查找成员:
private static object GetPrivateFieldValue(object target, string fieldName)
{
var targetType = target.GetType();
var targetField = targetType.GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance);
if (targetField == null)
{
throw new NullReferenceException(string.Format("{0}.{1} is null", targetType.Name, fieldName));
}
var fieldValue = targetField.GetValue(target);
return fieldValue;
}
在一次特殊情况下,我按如下方式使用它:
var values = (object[]) GetPrivateFieldValue(currentItem, "_values");
foreach (var fieldName in recordsReaderCacheEntry.FieldNames)
{
var valueIndex = Array.IndexOf(recordsReaderCacheEntry.FieldNames, fieldName);
var value = values[valueIndex];
currentRecordDictionary.Add(fieldName, value);
}
这一点可以正常工作,如果其中一个值在原始对象中为空,则它会降低,在值数组中表示为{}
。
我希望能够检查值是否等于{}
,因此我可以理想地将其替换为null。
然而,这不会编译:
if (value == {})
同样地,以下不要:
if (value == object) //obviously
if (value == new {}) //obviously
if (value == new object{}) //i hoped it might work
if (value == null) //this never matches as strictly speaking its not null
修改
为问题添加了关键的上下文更改细节...对不起家伙。
答案 0 :(得分:5)
编辑:更新问题:
您似乎正在尝试将value
字段与DBNull
进行比较,在您当前的代码中可以执行以下操作:
var value = values[valueIndex];
if(value is DBNull)
{
value = null;
}
(上一个答案)
如果你这样做:
var values = (object[]) GetPrivateFieldValue(currentItem, "_values");
这意味着你要回来一个数组(可能是一个空的)以检查空数组使用IEnumerable.Any
,如:
if(!values.Any())
{
//empty array found
values = null; //set it to null
}
您还可以比较返回数组的Length
,最好使用as
运算符进行强制转换:
var values = GetPrivateFieldValue(currentItem, "_values") as object[];
if(values != null && values.Length == 0)
{
//Empty found
values = null;
}