2009-05-13 2 views
4

У меня возникли проблемы с получением свойств вложенных объектов. Для примера, я работаю с, у меня есть 2 классов:C# Reflection: получение свойств вложенных объектов

public class user 
{ 
    public int _user_id {get; set;} 
    public string name {get; set;} 
    public category {get; set;} 
} 

public class category 
{ 
    public int category_id {get; set;} 
    public string name {get; set;} 
} 

достаточно просто там, и если я размышляю либо одну из них, я получаю правильные наборы GetProperties(), например, если я сделать это:

PropertyInfo[] props = new user().GetType().GetProperties(); 

я получить свойства user_id, имя и категории, и если я делаю это:

PropertyInfo[] props = new category().GetType().GetProperties(); 

я получить свойства CATEGORY_ID и категории; это работает отлично. Но, это где я запутаться ...

Как вы можете видеть, категория является последним свойством пользователя, если я делаю это

//this gets me the Type 'category' 
Type type = new user().GetType().GetProperties().Last().PropertyType; 
//in the debugger, I get "type {Name='category', FullName='category'}" 
//so I assume this is the proper type, but when I run this: 
PropertyInfo[] props = type.GetType().GetProperties(); 
//I get a huge collection of 57 properties 

Любая идея, где я лажать? Это можно сделать?

ответ

4

Посредством type.GetType() вы получаете typeof(Type), а не тип недвижимости.

Вобще

PropertyInfo[] props = type.GetProperties(); 

, чтобы получить свойства, которые вы хотите.

Однако, вы должны искать свойства их имени, а не по их порядку, потому что порядок не гарантируется, как вы ожидаете, что (см documentation):

Метод GetProperties не возврат свойства в конкретном порядке, например, в алфавитном порядке или порядок объявления. Ваш код не должен зависит от заказа, в котором возвращаются , так как это порядок варьируется.

+0

Я не ищу его с помощью .Last() - это было просто для простоты объяснения. – naspinski

+0

Очень хорошо. Поскольку эти вопросы индексируются поисковыми системами, я оставлю свой комментарий как есть, потому что я чувствую, что люди должны знать, что использование ордера следует избегать. – Lucero

+0

ничего себе, так просто ... Я просто думал слишком тяжело (или, может быть, недостаточно), спасибо! – naspinski

2

Удалить тип GetType(). Вы смотрите на свойства самого типа Type.

Смежные вопросы