Подтвердить что ты не робот

Исключение 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: несоответствие счетчика параметров.

Кто-нибудь знает, что это значит и как его избежать?

В случае, если кто-нибудь спросит, почему вы перечисляете свойства строки, в конечном итоге я надеюсь создать общий класс, который выведет свойства любого переданного ему типа (который может быть строкой...).

4b9b3361

Ответ 1

В этом случае одним из свойств строки является индекс для возврата символа в указанное место. Таким образом, при попытке GetValue метод ожидает индекса, но не получает его, вызывая исключение.

Ответ 2

System.String имеет индексированное свойство, которое возвращает char в указанном месте. Индексируемому свойству нужен аргумент (индекс в этом случае), поэтому исключение.

Ответ 3

Как ссылка... если вы хотите избежать исключения 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;
        }
    }
}

Надеюсь, что это поможет;-)