枚举string的属性时的TargetParameterCountException

时间:2011-05-27 19:00:21

标签: c# .net reflection

我正在使用以下代码输出属性值:

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

如果我为intFoo复杂类型运行此代码,则可以正常运行。但是如果我为string运行它(如图所示),我在foreach循环内的行上会出现以下错误:

System.Reflection.TargetParameterCountException:参数计数不匹配。

有谁知道这意味着什么以及如何避免它?

如果有人问'你为什么要通过字符串的属性进行枚举',最终我希望创建一个泛型类,它将输出传递给它的任何类型的属性(可能是一个字符串......)。

3 个答案:

答案 0 :(得分:24)

在这种情况下,字符串的一个属性是用于在指定位置返回字符的索引器。因此,当您尝试GetValue时,该方法需要索引但不会收到索引,从而导致异常。

要检查哪些属性需要索引,您可以在GetIndexParameters对象上调用PropertyInfo。它返回一个ParameterInfo数组,但你可以检查一下该数组的长度(如果没有参数,它将为零)

答案 1 :(得分:4)

System.String有一个索引属性,可返回指定位置的char。索引属性需要一个参数(在这种情况下为索引),因此是异常。

答案 2 :(得分: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;
        }
    }
}

希望它有所帮助;-)