2010-12-15 86 views
4

Le code de réflexion ci-dessous les rendements:L'analyse syntaxique est le seul moyen d'obtenir le type de membre?

System.Collections.Generic.IList`1[TestReflection.Car] Cars 

Comment puis-je obtenir le type de racine Cars par la réflexion? Pas IList<Car> - comment puis-je obtenir Car?

using System; 
using System.Reflection; 
using System.Collections.Generic; 

namespace TestReflection 
{ 
    class MainClass 
    { 
     public static void Main(string[] args) 
     { 
      Type t = typeof(Dealer); 
      MemberInfo[] mi = t.GetMember("Cars"); 

      Console.WriteLine("{0}", mi[0].ToString()); 
      Console.ReadLine(); 
     } 
    } 

    class Dealer 
    { 
     public IList<Car> Cars { get; set; } 
    } 

    class Car 
    { 
     public string CarModel { get; set; } 
    } 
} 

Répondre

12

La meilleure façon serait de produire un PropertyInfo qui représentait la propriété en question et son type sous-jacent via PropertyInfo.PropertyType. Ensuite, il suffit de récupérer les arguments de type pour ce type générique, pour lesquels vous pouvez utiliser Type.GetGenericArguments.

Type carsElementType = typeof(Dealer) 
         .GetProperty("Cars") 
         .PropertyType // typeof(IList<Car>) 
         .GetGenericArguments() // new[] { typeof(Car) } 
         .Single(); // typeof(Car) 
1

Vous prenez l'objet de type pour un type fermé puis utilisez GetGenericArguments que vous retourne la liste de tous les types substitués pour les paramètres génériques.

var l = new List<int>(); 
foreach(var genericArg in l.GetType().GetGenericArguments()) 
    Console.WriteLine(genericArg); // returns Int32