0

在 Windows 窗体中,我在加载事件中调用一个方法。在那里我用这个填充了一些文本框:

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

除了 DateTime 的“_Datum”之外,所有属性都是字符串?调用该方法时,将为每个 TabPage 加载数据。

在我的示例中,一个 TabPage 加载正确。在第二个 TabPage 中,日期属性为空。所以在这之后:

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

val 为空。

在下一行:

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

我可以在调试过程中看到,当鼠标悬停 ToString() 时,会显示“”(空字符串)。但是,如果我现在单击 F10,我的表单将显示出来。该方法停止。程序运行(以下文本框和选项卡未填充数据)。

没有例外!!我不明白。并且在任何地方都没有尝试捕获。

如果我直接使用设置为 null 的对象尝试此操作,则会引发异常。

那么这里会发生什么?为什么我的程序还在运行??

(现在我在每个 val = ... if val != null 之后进行测试,所以这不是问题。)

编辑:

我刚试过这个:

    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会导致这种奇怪的行为。

4

1 回答 1

1

您可以检查msdn 文档,或使用反射器/dotPeek 来查看如果为空则返回的Nullable<T>覆盖,而不是抛出。ToString()""

DateTime?is just Nullable<DateTime>,这就是为什么你得到一个空字符串并且没有例外。

编辑:该方法在执行时可能是“结束”,.Substring(0, 10)因为您将获得一个ArgumentOutOfRangeException. 空字符串的长度为 0,因此您不能请求长度为 10 的子字符串。

于 2013-07-23T16:29:15.287 回答