2009-05-18 7 views
0

J'essaie d'écrire une méthode d'extension pour les objets qui videront la structure de l'objet vers la sortie de débogage. Je cours dedans à un problème quand le propertyInfo est indexé (GetIndexParameters(). Length> 0).L'objet de type 'System.Reflection.ParameterInfo' ne peut pas être converti en type 'System.Int32'

J'ai essayé d'utiliser les éléments suivants:

object value = propInfo.GetValue(myObject, propInfo.GetIndexParameteres()); 

cela se traduit par l'erreur d'exécution suivante:

  • objet de type 'System.Reflection.ParameterInfo' ne peut pas être convertie en type « système .Int32 '

Vous avez des idées? Le code complet pour la méthode est la suivante:

[System.Diagnostics.Conditional("DEBUG")] 
public static void DebugObject(this object debugObject) 
{ 
    System.Diagnostics.Debug.WriteLine("Debugging object: " + debugObject.GetType().Namespace); 
    System.Diagnostics.Debug.WriteLine(String.Format("> {0}", debugObject.GetType())); 
    System.Diagnostics.Debug.Indent(); 
    try 
    { 
     if (debugObject.GetType().IsArray) 
     { 
      object[] array = ((object[])debugObject); 

      for (int index = 0; index < array.Length; index++) 
      { 
       System.Diagnostics.Debug.WriteLine(String.Format("- {{0}} = [{1}]", index, array[index])); 
      } 
      return; 
     } 

     object value = null; 
     foreach (System.Reflection.PropertyInfo propInfo in debugObject.GetType().GetProperties()) 
     { 
      try 
      { 
       if (propInfo.IsIndexed()) 
       { 
        System.Diagnostics.Debug.WriteLine(propInfo.ReflectedType.IsArray + " is indexed"); 
        // THIS IS WHERE IT CHOKES. As an example, try sending in something of type System.Net.Mail.MailMessage; 
        value = propInfo.GetValue(debugObject, propInfo.GetIndexParameters()); 
       } 
       else 
       { 
        value = propInfo.GetValue(debugObject, null); 
       } 

       if (value != null) 
       { 
        System.Diagnostics.Debug.WriteLine(String.Format("> {0} = [{1}]", propInfo.Name, value)); 

        if (
          (value.GetType() != typeof(string)) 
          && 
          (value.GetType() != typeof(int)) 
         ) 
        { 
         value.DebugObject(); 
        } 
       } 
      } 
      catch (System.Reflection.TargetParameterCountException tpce) 
      { 
       System.Diagnostics.Debug.WriteLine(
        String.Format(
         "> Could not run GetValue for {1} (type '{0}', '{2}') because of incorrect prarmeters", 
         propInfo.GetType().ToString(), 
         propInfo.Name, 
         propInfo.PropertyType.Namespace 
         ) 
        ); 
      } 
     } 
    } 
    finally 
    { 
     System.Diagnostics.Debug.Unindent(); 
    } 
} 

Répondre

1

C'est une mauvaise idée de vider les propriétés de l'indexeur. C'est similaire à la "méthode de vidage". C'est juste impossible.

Pensez également à utiliser PropertyInfo.CanRead avant d'essayer d'obtenir une valeur.

+0

chemin de moindre résistance Je me sens, merci! – mnield

0

Vous essayez d'accéder à l'essentiel SomeProp [foo, bar ...] ... donc; Quelles sont les valeurs d'index sensibles? Pour les entiers, peut-être 0,0,0 ... est sûr - peut-être pas. Ça dépend du contexte. Personnellement, je ne suis pas sûr que ce soit la meilleure façon de procéder. Je pourrais regarder IList sur l'objet principal, mais autre que cela - juste regarder les propriétés régulières ...

+0

Merci pour la réponse, quand j'aurai plus de temps libre, j'aurai un meilleur look, mais pour l'instant je vais l'éviter. – mnield

Questions connexes