2011-05-27 15 views
14

estoy usando el siguiente código de valores de salida de propiedades:TargetParameterCountException al enumerar a través de propiedades de cadena

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

Si ejecuta este código para la int, o para el tipo complejo Foo, funciona bien. Pero si lo corro para la string (como se muestra), me sale el siguiente error en la línea dentro del bucle foreach:

System.Reflection.TargetParameterCountException: Parámetro recuento desajuste.

¿Alguien sabe lo que esto significa y cómo evitarlo?

En caso de que alguien pregunte '¿por qué está enumerando a través de las propiedades de una cadena', eventualmente espero crear una clase genérica que muestre las propiedades de cualquier tipo que se le pase (que podría ser una cadena ...) .

+0

Tal vez sería más útil preguntar cómo crear una Enumerador de valor de propiedad basado en la reflexión? – hemp

Respuesta

20

En este caso, una de las propiedades de la cadena es el indexador para devolver el carácter en la ubicación especificada. Por lo tanto, cuando intenta obtener GetValue, el método espera un índice pero no recibe uno, lo que causa la excepción.

+1

Gracias. ¿Cómo puedo detectar y evitar las propiedades basadas en índices? – David

+7

Llamar a GetIndexParameters en el objeto PropertyInfo. Devuelve una matriz de ParameterInfo, pero puede verificar la longitud de esa matriz (si no hay parámetros, será cero) – Jamie

3

System.String tiene una propiedad indexada que devuelve el char en la ubicación especificada. Una propiedad indexada necesita un argumento (índice en este caso) y, por lo tanto, la excepción.

1

Así como referencia ... si se quiere evitar la TargetParameterCountException al leer las propiedades valores:

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

espero que ayude ;-)

Cuestiones relacionadas