我正在使用以下代码输出属性值:
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 :(得分: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;
}
}
}
希望它有所帮助;-)