5

我得到这个:

    private object setReportValues(object report, FormCollection values)
    {
        PropertyInfo[] properties = report.GetType().GetProperties();
        foreach (PropertyInfo property in properties)
        {
            string val = values.GetValue(property.Name).ToString();
            property.SetValue(report, val, null);
        }
        return report;
    }

异常开启string val = values.GetValue(property.Name).ToString();。我必须先检查空值吗?

4

4 回答 4

4

我必须先检查空值吗?

在这条线上,是的:

string val = values.GetValue(property.Name).ToString()

仅仅是因为该特定属性的价值可能null.

于 2012-07-23T11:50:08.727 回答
3

我会四处走动,并建议在提供property.Name的 in 中没有财产values。因此,您对 values.GetValue 的调用返回 null。当您尝试对该空值执行 ToString() 时,它会抱怨。

简而言之,您的 values 变量包含什么?

更新:

根据提供的值是 FormsCollection 的信息,您的属性集合很可能包含一些您没有 FormsCollection 字段的属性。发生的情况是您尝试获取此字段,它返回一个空值,然后您调用 ToString ,导致一切中断。

当你遇到它们时,我会颠倒我的策略并循环通过我的 FormsCollection 来获取属性。另一种方法是保持原样,并在执行 ToString 之前检查 null。

PS:我希望您在表单上表示的所有属性都是字符串,否则会损坏。

于 2012-07-23T11:52:08.037 回答
0

为什么要勉强.ToString()null对大多数事情来说是一个完全合法的价值。目前尚不清楚是什么values,所以我假设它来自您自己的代码,但是:

object val = values.GetValue(property.Name);
property.SetValue(report, val, null);

根据什么values ,您可能还想检查“有一个值,即为空”与“没有任何定义的值”之间的区别。就个人而言,我希望做类似的事情:

object val;
if(values.TryGetValue(property.Name, out val)) {
    property.SetValue(report, val, null);
}
于 2012-07-23T11:51:42.613 回答
0

刚刚遇到了同样的问题,但我找到了一个无需使用循环的解决方案:

private object setReportValues(object report, FormCollection values)
{
    PropertyInfo[] properties = report.GetType().GetProperties();
    foreach (PropertyInfo property in properties)
    {
        string val = values.GetValue(property.Name)?.ToString();
        property.SetValue(report, val, null);
    }
    return report;
}

我通过?...property.Name).

于 2017-12-01T00:44:31.133 回答