解析是获取成员类型的唯一方法吗?

时间:2010-12-15 10:22:20

标签: c# .net generics reflection

下面的反射代码返回:

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; }
    }
}

2 个答案:

答案 0 :(得分:12)

最简单的方法是生成PropertyInfo代表有问题的属性,然后通过PropertyInfo.PropertyType生成其基础类型。然后,只需检索此泛型类型的类型参数,您可以使用Type.GetGenericArguments

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

答案 1 :(得分:1)

将Type对象作为已关闭的Type,然后使用GetGenericArguments返回替换泛型参数的所有类型的列表。

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