Как получить "тип класса" свойства в классе с помощью отражения? - PullRequest
2 голосов
/ 16 апреля 2011

вот кусок кода

 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» (класс, содержащий свойство). Я был бы признателен, если кто-нибудь может предложить решение. Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 16 апреля 2011

Вы можете использовать метод GetGenericArguments () и сделать:

typeof(Order).GetProperty("OrderDetails").PropertyType.GetGenericArguments()[0]
2 голосов
/ 16 апреля 2011

Тип, возвращаемый PropertyInfo.PropertyType, будет typeof(List<OrderDetail>)

используя это, вы можете получить аргументы типа используя Type.GetGenericArguments()

Type propertyType = property.PropertyType;

if(propertyType.IsGeneric && propertyType.GetGenericTypeDefinition() == typeof(List<>))
{
    Type argType = propertyType.GetGenericArguments()[0];
    // argType will give you your OrderDetail
}
1 голос
/ 16 апреля 2011

Вы ищете, как узнать об универсальных аргументах?

Допустим, у вас есть экземпляр Order в некоторой переменной, например "someOrder":

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

Так как List имеетодин универсальный параметр, метод Type.GetGenericArguments вернет массив элемента: Тип заказа.

Это решает вашу проблему, не так ли?

Кажется, вы не знали, что OrderDetailstype is List`1 (универсальный список с одним универсальным параметром).PropertyInfo.PropertyType предоставляет это, потому что тип такого свойства является общим списком.Вы хотите знать универсальный тип этого универсального списка.

...