2015-08-04 3 views
0

У меня есть большой иерархический объект, и я хочу, чтобы у него была одна собственность. Проблема в том, что каждый уровень этого объекта может быть нулевым. (данные Это из структурированных XML)иерархические данные с возможным нулевым объектом

Я хочу что-то вроде этого:

_data = record.RltdPties.DbtrAcct.Id.Item 

, если один из этого подвида объекта равна нулю, то данные должны быть также нулевым. Есть ли лучший способ, проверить мой объект вместо этого:

if(record!=null && record.RltdPties != null && record.RltdPties.DbtrAcct != null && record.RltdPties.DbtrAcct.Id != null) 
{ 
    _data = record.RltdPties.DbtrAcct.Id.Item 
} 

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

ответ

2

с C# 5,0

_data = record?.RltdPties?.DbtrAcct?.Id?.Item 
+0

не так ли 6.0? – CarbineCoder

+2

Это будет C# 6.0, а не 5.0 –

0

Если вы можете использовать C# 6.0, вы можете использовать условный оператор нуль. http://www.codeproject.com/Articles/850832/What-s-new-in-Csharp-Null-conditional-operators

enter image description here

В вашем случае это будет _data = record?.RltdPties?.DbtrAcct?.Id?.Item

+0

, что будет храниться в _data, если, например, DbtrAcct имеет значение null? _data будет null или содержимое RltdPties? –

+0

_data будет null. Нулевой оператор условного обозначения должен интерпретироваться как «если объект слева не является нулевым, выберите все, что находится справа, в противном случае верните null». – cverb

+0

спасибо @cverb! –

1

Я думаю попробовать прилов-блок будет абсолютное правильное решение здесь, потому что вы должны проверить все дерево вниз и не что на пути объектов есть любые возможные ветви. Возможно, он не похож на C#, но иногда EAFP (проще просить прощения, чем разрешение) делает его достаточно простым.

try 
{ 
    _data = record.RltdPties.DbtrAcct.Id.Item 
} 
catch NullReferenceException 
{ 
    // do whatever then to do 
} 
+0

кто-нибудь хочет сказать мне, почему я ниспровергаюсь? –

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