Прежде всего
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"