{}在检查变量时意味着什么?

时间:2015-04-15 15:10:06

标签: c#

我有类似于以下代码的东西,它使用反射查找成员:

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  

修改

为问题添加了关键的上下文更改细节...对不起家伙。

1 个答案:

答案 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;
}