2015-04-15 5 views
2

у меня есть что-то похожее на следующий код, который выглядит до члена с помощью отражения:Что означает {} при проверке переменной?

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); 
} 

Это прекрасно работает до точки, он падает, если одно из значений пусто в исходном объекте, его представлено как {} в массиве значений.

Я хочу, чтобы проверить, равно ли значение {}, поэтому я могу заменить его нулевым идеалом.

Это, однако, не компилируется:

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 

EDIT

Добавлен решающий контекст изменения деталей на вопрос ... Извините ребята.

+1

Итак, вы хотите знать, если массив пуст, если да, то установите его в нуль? Почему не просто: 'if (values! = Null && values.Length == 0) values ​​= null;' –

+0

Выражение имеет некоторое значение (например, переменную или функцию или литерал). Скобки не могут быть оценены, поэтому фигурные скобки не являются выражениями. – sircodesalot

+0

Вы исходите из более низкого фона JavaScript, не так ли? –

ответ

5

EDIT: для обновления вопрос:

Похоже, что вы пытаетесь сравнить 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; 
} 
+0

Извините, я пропустил важную часть вопроса, теперь –

+0

@TomRiley, поэтому из вашего вопроса, вы хотите проверить, если для строки 'var value = values ​​[valueIndex];', переменная 'значение' является массивом и если она пуста, назначьте ее null? I – Habib

+0

значения [valueIndex] могут быть многих типов, но если это DBNull, я хочу установить его на нуль. –

Смежные вопросы