2011-04-16 71 views
2

这里是一段代码如何通过反射来获取类中某个属性的“类类型”?

public class Order 
    { 
     //Primary Key 

    public long OrderId { get; set; } 

    //Many to One Relationship 
    [ParentObject("PersonId")] 
    public Person Buyer { get; set; } 

    //One to Many Relationship 
    [ChildObject("OrderId")] 
    public List<OrderDetail> OrderDetails { get; set; } 

    public decimal TotalAmount 
    { 
     get 
     { 
      if (OrderDetails == null) 
       return 0; 

      return OrderDetails.Sum(o => o.LineItemCost); 
     } 
    } 

    public string Notes { get; set; } 
} 

我试图检查订单的对象。现在我想要做的是:让所有的性质,并尝试找出例如

public List<OrderDetail> OrderDetails { get; set; } 

我想要得到的类型“的OrderDetail”是另一个类的类类型。当我尝试使用PropertyInfo.PropertyType获取它时,我得到“List1”(泛型类型),PropertyInfo.GetType()给出了一些System.Reflection.RuntimeType,PropertyInfo.DeclaringType给出了“Order”(包含该属性的类)。如果有人能够提出解决方案,我将不胜感激。提前致谢。

回答

2

可以使用GetGenericArguments()方法得到了类型参数是typeof(List<OrderDetail>)

做:

typeof(Order).GetProperty("OrderDetails").PropertyType.GetGenericArguments()[0] 
1

您是否在寻找如何了解泛型参数?

比方说,你已经订购的实例,在一些变量,如“someOrder”:

someOrder.OrderDetails.GetType().GetGenericArguments(); 

由于列表中包含了一个泛型参数,Type.GetGenericArguments方法返回一个项目的数组:订单类型。

它解决了你的问题,不是吗?

看来你不知道OrderDetails类型是List`1(一个通用参数的泛型列表)。 PropertyInfo.PropertyType公开说明,因为这种属性的类型是一个通用列表。您想知道该通用列表的通用类型。

2

通过PropertyInfo.PropertyType返回的类型将使用这个,你可以使用Type.GetGenericArguments()

Type propertyType = property.PropertyType; 

if(propertyType.IsGeneric && propertyType.GetGenericTypeDefinition() == typeof(List<>)) 
{ 
    Type argType = propertyType.GetGenericArguments()[0]; 
    // argType will give you your OrderDetail 
} 
相关问题