В форме окна я вызываю метод в событии загрузки. Там я заполнить некоторые 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
вызовет такое странное поведение.
'Nullable' overrode 'ToString' не выдавать исключение на' null'. –
Из любопытства, что со всем отражением? У каждого экземпляра вашего объекта «TabPage» есть другой набор имен свойств? Это, безусловно, нетрадиционные. – nicholas
@newStackExchangeInstance, как вы сказали, 'DateTime?' Aka 'Nullable .ToString()' возвращает пустую строку вместо того, чтобы выбрасывать исключение. Это ответ на вопрос, так почему бы не опубликовать его как ответ? –
nicholas