下面的反射代码返回:
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; }
}
}
答案 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