TargetParameterCountException при перечислении через свойства строки - PullRequest
16 голосов
/ 27 мая 2011

Я использую следующий код для вывода значений свойств:

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

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

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

Ответы [ 3 ]

24 голосов
/ 27 мая 2011

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

Чтобы проверить, для каких свойств требуется индекс, вы можете вызвать GetIndexParameters для объекта PropertyInfo,Он возвращает массив ParameterInfo, но вы можете просто проверить длину этого массива (если нет параметров, он будет равен нулю)

4 голосов
/ 27 мая 2011

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

1 голос
/ 28 июля 2015

Так же, как ссылка ... если вы хотите избежать 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;
        }
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...