2012-07-23 66 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,我相信新的功能)加入?固定它。