2009-04-24 8 views
1

Je voudrais être en mesure d'imprimer les propriétés d'un objet, et j'ai rencontré un problème lorsque j'ai frappé des collections imbriquées de iLists.C# - Réflexion en utilisant des génériques: Problème avec les collections imbriquées de ILists

foreach (PropertyInformation p in properties) 
      { 
       //Ensure IList type, then perform recursive call 
       if (p.PropertyType.IsGenericType) 
       { 
         // recursive call to PrintListProperties<p.type?>((IList)p,"  "); 
       } 

Quelqu'un peut-il vous offrir de l'aide?

Vive

KA

Répondre

3

Je pense juste à haute voix ici. Peut-être que vous pouvez avoir une méthode PrintListProperties non générique qui ressemble à ceci:

private void PrintListProperties(IList list, Type type) 
{ 
    //reflect over type and use that when enumerating the list 
} 

Ensuite, lorsque vous tombez sur une liste imbriquée, faire quelque chose comme ceci:

if (p.PropertyType.IsGenericType) 
{ 
    PringListProperties((Ilist)p,p.PropertyType.GetGenericArguments()[0]); 
} 

Encore une fois, ne sont pas testés , mais lui donner un tourbillon ...

+1

+1. Sauf si vous faites quelque chose avec le type dans votre fonction, il n'a pas besoin d'être générique. Si tout ce que vous faites est l'inspection de réflexion, vous devriez être capable de passer l'instance de type de cette façon. –

2
p.PropertyType.GetGenericArguments() 

vous donnera un tableau des arguments de type. (dans ce cas, avec un seul élément, le T dans IList<T>)

+1

Sa question invoque sa fonction actuelle (PrintListProperties ) en ayant une instance du type, plutôt que le type lui-même. –

3
foreach (PropertyInfo p in props) 
    { 
     // We need to distinguish between indexed properties and parameterless properties 
     if (p.GetIndexParameters().Length == 0) 
     { 
      // This is the value of the property 
      Object v = p.GetValue(t, null); 
      // If it implements IList<> ... 
      if (v != null && v.GetType().GetInterface("IList`1") != null) 
      { 
       // ... then make the recursive call: 
       typeof(YourDeclaringClassHere).GetMethod("PrintListProperties").MakeGenericMethod(v.GetType().GetInterface("IList`1").GetGenericArguments()).Invoke(null, new object[] { v, indent + " " }); 
      } 
      Console.WriteLine(indent + " {0} = {1}", p.Name, v); 
     } 
     else 
     { 
      Console.WriteLine(indent + " {0} = <indexed property>", p.Name); 
     } 
    }  
0
var dataType = myInstance.GetType(); 
var allProperties = dataType.GetProperties(BindingFlags.Public | BindingFlags.Instance); 
var listProperties = 
    allProperties. 
    Where(prop => prop.PropertyType.GetInterfaces(). 
     Any(i => i == typeof(IList))); 
Questions connexes