2010-12-15 3 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.PropertyTypeを経由して、問題の性質とその基になる型を表すPropertyInfoを生成することであろう。次に、汎用タイプの型引数を取得するだけです。その場合、Type.GetGenericArgumentsを使用できます。

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

あなたは、閉鎖型の型オブジェクトを取り、その後、あなたの一般的なパラメータの代わりに、すべてのタイプのリストを返しますGetGenericArgumentsを使用しています。

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