2015-10-14 81 views
0

我有一個文本框和一個自定義屬性是bool的datagridview。我使用反射在運行時啓用文本框或datagridview,具體取決於我的自定義屬性的設置。代碼遍歷每個控件的屬性,如果它是我的自定義屬性和true,那麼我啓用該控件。C#反射控制屬性參數計數不匹配異常

我只在datagridview中出現「參數計數不匹配」異常。我找到了一個解決方法,但我不知道它爲什麼有效。下面的第一個foreach循環引發異常。第二個不是。

我做了一些搜索,我發現指向屬性是索引器的點。我知道它不是和GetIndexParameters()。對於兩種控件類型,屬性的長度都是0。爲什麼第一個例子沒有工作?

Type type = control.GetType(); 
    PropertyInfo[] properties = type.GetProperties(); 

    //Exception 
    foreach (PropertyInfo property in properties) 
    { 
     if (property.Name == PropName & Convert.ToBoolean(property.GetValue(control, null)) == true) 
      (control as Control).Enabled = true; 
    } 

    //No excpetion 
    foreach (PropertyInfo property in properties) 
    { 
     if (property.Name == PropName) 
      if(Convert.ToBoolean(property.GetValue(control, null)) == true) 
       (control as Control).Enabled = true; 
    } 

回答

1
if (property.Name == PropName & Convert.ToBoolean(property.GetValue(control, null)) == true) 

您正在使用的&代替&&這意味着你正在嘗試在執行GetValue財產,不管名稱。

在第二個例子中,你只嘗試GetValue匹配性質,所以GetValue從未被稱爲上拋出第一循環異常的財產。

1

您使用了不會短路的單個&。這意味着無論property.Name == PropName的結果如何,它總是會評估第二個操作數,在這種情況下是Convert.ToBoolean(property.GetValue(control, null)) == true聲明。

使用雙符號&&短路,不會,如果第一個成果,false計算第二個操作數。

相關問題