2012-07-23 67 views
1

我得到这个:获得一个NullReferenceException

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();。我必须先检查空值吗?

+0

抛出的错误是什么? – dtsg 2012-07-23 11:48:48

+0

什么是“价值”?什么是“报告”?你为什么使用反射? – leppie 2012-07-23 11:51:09

+4

嗨,欢迎来到SO!将来,最好还包括异常信息,例如哪一​​行实际引发异常。这样,我们会更好地装备来帮助你。 =) – 2012-07-23 11:51:10

回答

1

我要去上肢体,并建议有在values提供property.Name无属性。所以你对values.GetValue的调用返回null。当您尝试对该空值执行ToString()时,它会抱怨。

总之,你的值变量包含什么?

更新:

随着该值是FormsCollection这是很可能的是,你的属性集合包含哪些你没有FormsCollection领域的一些属性所提供的信息。然后会发生什么是你试图获得这个字段,它返回一个空值,你调用ToString,导致一切都中断。

我会颠倒我的战略,并通过我的FormsCollection循环获取属性1,当你遇到他们。另一种方法是保留它,并在执行ToString之前检查null。 PS:我希望表单上的所有属性都是字符串,否则会破坏。

+0

这是'FormCollection' – lolli 2012-07-23 11:58:08

+0

让他们1 1是麻烦的。表格上也有日期。 – lolli 2012-07-23 12:34:45

+0

我的意思是在循环内动态地1,1,我不觉得麻烦。但是,这完全取决于你,我猜想。至少现在你知道它是如何融合在一起的。快乐的编码! :) – Mithon 2012-07-23 13:57:17

4

是否必须先检查空值?

在这条线,是:

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

很简单,因为特定财产的价值可能null

0

为什么你会强迫.ToString()?对于大多数事情来说,null是完全合法的价值。目前还不清楚是什么values是的,所以我认为从自己的代码来了,但:根据什么values

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

,你也可能要检查之间“有一个值的差值,那是空的“vs”没有任何定义的值“。就个人而言,我会期望做这样的事情:

object val; 
if(values.TryGetValue(property.Name, out val)) { 
    property.SetValue(report, val, null); 
} 
+0

需要字符串进一步的行动:),thnx顺便说一句。 – lolli 2012-07-23 12:45:25

0

恰好碰到了同样的问题,但我找到了一个解决方案,而无需使用一个循环:在...property.Name)

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

我通过(在C#6.0,我相信新的功能)加入?固定它。