2010-12-15 78 views
4

反射代碼如下收益:是解析獲取成員類型的唯一方法嗎?

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

我怎樣才能獲得通過反射Cars根型?不是IList<Car> - 我怎樣才能得到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; } 
    } 
} 

回答

12

的最簡單的方法是將產生PropertyInfo其表示通過PropertyInfo.PropertyType有問題的屬性,然後它的基礎類型。然後,它只是檢索此泛型的類型參數,您可以使用它Type.GetGenericArguments

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

您將Type對象放在一個封閉的Type中,然後使用GetGenericArguments返回所有類型的列表替換爲通用參數。

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