2011-05-27 28 views
14

的特性列舉我使用下面的代碼性能的輸出值時:TargetParameterCountException通過串

string output = String.Empty; 
string stringy = "stringy"; 
int inty = 4; 
Foo spong = new Foo() {Name = "spong", NumberOfHams = 8}; 
foreach (PropertyInfo propertyInfo in stringy.GetType().GetProperties()) 
{ 
    if (propertyInfo.CanRead) output += propertyInfo.GetValue(stringy, null); 
} 

如果我跑了int這段代碼,或爲Foo複雜類型,它工作正常。但是如果我爲string運行它(如圖所示),我會在foreach循環內的線路上收到以下錯誤:

System.Reflection.TargetParameterCountException:參數計數不匹配。

有誰知道這意味着什麼,以及如何避免呢?

如果有人問'爲什麼要通過字符串的屬性來枚舉',最後我希望創建一個泛型類,它將輸出傳遞給它的任何類型的屬性(可能是一個字符串......) 。

+0

也許會更有幫助請問如何創建基於反射的屬性值枚舉器? – hemp 2011-05-27 19:08:02

回答

20

在這種情況下,該字符串的屬性之一是在指定的位置返回字符的索引。因此,當您嘗試使用GetValue時,該方法需要一個索引但不會收到一個,導致該異常。

+1

謝謝。我如何檢測和避免基於索引的屬性?在PropertyInfo對象上 – David 2011-05-27 19:16:55

+7

呼叫GetIndexParameters。它返回的ParameterInfo數組,但你可以檢查數組的長度(如果沒有參數,這將是零) – Jamie 2011-05-27 19:20:22

3

System.String有一個返回在指定的位置的char索引屬性。索引屬性需要一個參數(在這種情況下是索引),因此是例外。

1

只是作爲參考...如果你想避免TargetParameterCountException讀取屬性的值時:

// Ask each childs to notify also, if any could (if possible) 
foreach (PropertyInfo prop in options.GetType().GetProperties()) 
{ 
    if (prop.CanRead) // Does the property has a "Get" accessor 
    { 
     if (prop.GetIndexParameters().Length == 0) // Ensure that the property does not requires any parameter 
     { 
      var notify = prop.GetValue(options) as INotifyPropertyChanged; 
      if (notify != null) 
      { 
       notify.PropertyChanged += options.OptionsBasePropertyChanged; 
      } 
     } 
     else 
     { 
      // Will get TargetParameterCountException if query: 
      // var notify = prop.GetValue(options) as INotifyPropertyChanged; 
     } 
    } 
} 

希望它可以幫助;-)