Мне нужно получить значение от Nested Property - PullRequest
1 голос
/ 09 мая 2011

Мне нужно получить значение из вложенного свойства.

В MainClass у меня есть свойство Student, которое является типом класса Student.

MainClass obj = new MainClass ();

obj.Name = "XII";
obj.Students = new List<Students>()
    {
        new Students() { ID = "a0", Name = "A" },
        new Bridge() { ID = "a1", Name = "B" }
    };

Type t = Type.GetType(obj.ToString());
PropertyInfo p = t.GetProperty("Students");

object gg = p.GetValue(obj, null);
var hh = gg.GetType();
string propertyType = string.Empty;

if (hh.IsGenericType)
    {
        string[] propertyTypes = hh.ToString().Split('[');
        Type gggg = Type.GetType(propertyTypes[1].Remove(propertyTypes[1].Length - 1));
        foreach (PropertyInfo pro in gggg.GetProperties())
             {
                 if (pro.Name.Equals("Name"))
                 {
                     // Get the value here
                 }
             }
    } 

Ответы [ 2 ]

2 голосов
/ 09 мая 2011

Прежде всего

Type t = Type.GetType(obj.ToString());

неправильно. Это работает, только если класс не перегружен методом ToString (), и будет падать во время выполнения, если это так. К счастью, у каждого класса есть метод GetType () (он определен для объекта, поэтому Type t = obj.GetType() - правильный код.

Во-вторых,

string[] propertyTypes = hh.ToString().Split('[');
Type gggg = Type.GetType(propertyTypes[1].Remove(propertyTypes[1].Length - 1)

- это ужасный способ получить указанный тип универсального типа, так как есть метод GetGenericArguments, который делает это за вас, поэтому этот код можно изменить с помощью

Type[] genericArguments = hh.GetGenericArguments();
Type gggg = genericArguments[0];

А теперь к настоящей проблеме - доступ к элементу списка. Лучший способ сделать это - использовать индексатор ([]) класса List<>. В c #, когда вы определяете индексатор, он автоматически переносится в свойство с именем Item, и мы можем использовать это свойство для извлечения наших значений (имя Item можно вывести из определения типа, но по большей части это может быть жестко закодировано)

PropertyInfo indexer = hh.GetProperty("Item");  // gets the indexer

//note the second parameter, that's the index
object student1 = indexer.GetValue(gg, new object[]{0}); 
object student2 = indexer.GetValue(gg, new object[]{1}); 

PropertyInfo name = gggg.GetProperty("Name");
object studentsName1 = name.GetValue(student1, null); // returns "A"
object studentsName2 = name.GetValue(student2, null); // returns "B"
0 голосов
/ 09 мая 2011

Переопределить Equals метод для классов Students и Bridge, затем использовать Find или LINQ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...