2013-07-23 3 views
0

В форме окна я вызываю метод в событии загрузки. Там я заполнить некоторые TextBoxes с этим:Почему этот код работает без исключения

 foreach (TabPage page in tabControl_Berichte.TabPages) 
     { 
      uc_MusterberichtProzessdetails bla = (uc_MusterberichtProzessdetails)page.Controls[0]; 

      object val = musterbericht.GetType().GetProperty(page.Name + "_Bem").GetValue(musterbericht, null); 
       bla.tB_Bemerkung.Text = val.ToString(); 

      val = musterbericht.GetType().GetProperty(page.Name + "_Bearb").GetValue(musterbericht, null); 
       bla.tB_Bearbeiter.Text = val.ToString(); 

      val = musterbericht.GetType().GetProperty(page.Name + "_Datum").GetValue(musterbericht, null); 
       bla.tB_Datum.Text = val.ToString().Substring(0, 10); 

      val = musterbericht.GetType().GetProperty(page.Name + "_Erledigt").GetValue(musterbericht, null); 
       bla.chB_Erledigt.Checked = (bool)val; 

      val = musterbericht.GetType().GetProperty(page.Name + "_Dauer").GetValue(musterbericht, null); 
       bla.tB_Dauer.Text = val.ToString(); 
     } 

Все свойства являются строками, за исключением из «_Datum», который является DateTime? Когда метод вызывается, данные будут загружены для каждой вкладки.

В моем примере загружена одна вкладка. На второй вкладке свойство Date имеет значение NULL. Поэтому после этого:

val = musterbericht.GetType().GetProperty(page.Name + "_Datum").GetValue(musterbericht, null); 

val is null.

В следующей строке:

bla.tB_Datum.Text = val.ToString().Substring(0, 10); 

можно увидеть, что во время отладки при наведении ToString() показан «» (пустая строка). Но если я сейчас нажму F10, моя форма будет показана. Метод останавливается. Программа запускается (следующие текстовые поля и вкладки не заполняются данными).

Нет НИКАКОГО исключения! Я не понимаю. И нигде не пытайтесь поймать.

Если я попробую это прямо с объектом, для которого установлено значение null, генерируется исключение.

Итак, что здесь происходит? Почему моя программа все еще работает?

(Теперь я тестирую после каждого Вэл = ... если вал = нуль, так что это не проблема!).

EDIT:

Я просто попытался это:

DateTime? dttest = null; 
    object objtest = dttest; 
    string strtest = objtest.ToString(); 

И здесь я получаю исключение в ToString().

В приведенном выше примере я также попытался

val = musterbericht.GetType().GetProperty(page.Name + "_Datum").GetValue(musterbericht, null); 
if (val.ToString().Length > 0) 
    bla.tB_Datum.Text = val.ToString().Substring(0, 10); 

Здесь почти такое же поведение, как описано выше. Здесь метод останавливается на этапе if (val.ToString().Length > 0), и событие загрузки прерывается. (Все еще не исключение)

Похоже, что val.ToString() работает, но val.ToString().xxxxx вызовет такое странное поведение.

+0

'Nullable ' overrode 'ToString' не выдавать исключение на' null'. –

+0

Из любопытства, что со всем отражением? У каждого экземпляра вашего объекта «TabPage» есть другой набор имен свойств? Это, безусловно, нетрадиционные. – nicholas

+0

@newStackExchangeInstance, как вы сказали, 'DateTime?' Aka 'Nullable .ToString()' возвращает пустую строку вместо того, чтобы выбрасывать исключение. Это ответ на вопрос, так почему бы не опубликовать его как ответ? – nicholas

ответ

1

Вы можете проверить msdn docs или использовать отражатель/dotPeek, чтобы увидеть, что Nullable<T> переопределяет ToString() вернуть "" если нуль, а не бросать.

DateTime? - это просто Nullable<DateTime>, поэтому вы получаете пустую строку и не исключение.

Edit: метод, вероятно, «окончание», когда .Substring(0, 10) выполняется потому, что вы собираетесь получить ArgumentOutOfRangeException. Пустая строка имеет длину 0, поэтому вы не можете запросить подстроку длиной 10.

+0

Спасибо, это правильно. Но по-прежнему нет ответа, почему метод заканчивается после того, как существует 'Nullable .ToString(). Substring (10)'? – RodMcKay

+0

То же самое происходит, если я делаю 'if (val.ToString(). Lenght> 0)'. Кажется, что работает только 'ToString()', но 'ToString(). Xxxx' приведет к такому поведению. – RodMcKay

+0

Только что обновил ответ. Я могу сделать 'val.ToString(). Length' просто отлично, он возвращает 0. Однако' val.ToString(). Substring (0, 10) 'выдает исключение, потому что пустая строка имеет длину меньше 10. – Alden

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