Использование рефлексии для вложенного класса - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Вопрос такой. Есть класс, например, public class Class1 в нем куча полей и свойств простых типов (риал, инт, стринг и тд) и есть поля и свойства типа Class2 (который может состоять как из простых типов, так и из классов) Нужны методы для получения всех имен свойств (если свойство является классом то необходимо вызывать рефлексию для него, и получить свойства из которых состоит этот класс) и для получения всех значений. Для получения имен я написал метод:
Листинг программы
  1. public static void GetNamesOfClassProps1(Type clType, out string[] names)
  2. {
  3. PropertyInfo[] getsProp = clType.GetProperties(BindingFlags.Instance | BindingFlags.Public);
  4. int i = 0;
  5. string []names1 = new string[getsProp.Length];
  6. Type[] types = new Type[getsProp.Length];
  7. // Как избавится от константы в строчке ниже?
  8. string[] names2 = new string[2];
  9. string[] temp = new string[getsProp.Length+ names2.Length];
  10. foreach (PropertyInfo propInfo in getsProp)
  11. {
  12. names1[i] = propInfo.Name;
  13. types[i] = propInfo.PropertyType;
  14. if (types[i].IsClass == true)
  15. {
  16. GetNamesOfClassProps1(types[i], out names2);
  17. }
  18. i += 1;
  19. }
  20. for (int j = 0; j < names1.Length; j++)
  21. temp[j] = names1[j];
  22. for (int j = 0; j < names2.Length; j++)
  23. {
  24. if (names2[j] != null)
  25. temp[j + names1.Length] = names2[j];
  26. }
  27. names = temp;
  28. }
Правда, очень страшно выглядит, как бы сделать покрасивее? и избавится от константы? она все портит((( Для получения значений:
Листинг программы
  1. public static void ReadFromClassProps(object elClass, out object[] readed)
  2. {
  3. Type clType = elClass.GetType();
  4. PropertyInfo[] getsProp = clType.GetProperties(BindingFlags.Instance | BindingFlags.Public);
  5. readed = new object[getsProp.Length];
  6. int i = 0;
  7. foreach (PropertyInfo propInfo in getsProp)
  8. {
  9. if (propInfo.CanRead)
  10. {
  11. readed[i] = propInfo.GetValue(elClass);
  12. }
  13. i += 1;
  14. }
  15. }
Тут не могу додумать, а как вызывать функцию для вложенного класса (как в примере с получением имен) В методе выше я передавал тип, а тут нужно передавать объект. как это сделать? Извиняюсь за глупый вопрос. Помогите, пожалуйста(((

Решение задачи: «Использование рефлексии для вложенного класса»

textual
Листинг программы
  1.     class Class1
  2.     {
  3.         public int Prop1 { get; set; } = 1;
  4.         public byte Prop2 { get; set; } = 2;
  5.         public long Prop3 { get; set; } = 3;
  6.         public float Prop4 { get; set; } = 4.5f;
  7.         public Class2 Prop5 { get; set; } = new Class2();
  8.         public string Prop6 { get; set; } = "1234";
  9.  
  10.         public List<string> GetPropertyNames()
  11.         {
  12.             List<string> result = new List<string>();
  13.  
  14.             result.AddRange(GetPropertyNames(GetType()));
  15.  
  16.             return result;
  17.         }
  18.  
  19.         public List<string> GetPropertyNames(Type type)
  20.         {
  21.             List<string> result = new List<string>();
  22.  
  23.             PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
  24.  
  25.             foreach(var prop in properties)
  26.             {
  27.                 result.Add(prop.Name);
  28.  
  29.                 if (prop.PropertyType.IsClass && prop.PropertyType != typeof(string))
  30.                 {
  31.                     foreach(var prop2 in GetPropertyNames(prop.PropertyType))
  32.                     {
  33.                         result.Add(prop.Name + "." + prop2);
  34.                     }
  35.                 }
  36.             }
  37.  
  38.             return result;
  39.         }
  40.  
  41.         public List<object> GetPropertyValues()
  42.         {
  43.             List<object> result = new List<object>();
  44.  
  45.             result.AddRange(GetPropertyValues(GetType(), this));
  46.  
  47.             return result;
  48.         }
  49.  
  50.         public List<object> GetPropertyValues(Type type, object obj)
  51.         {
  52.             List<object> result = new List<object>();
  53.  
  54.             PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
  55.  
  56.             foreach (var prop in properties)
  57.             {
  58.                 var obj2 = prop.GetValue(obj);
  59.                 result.Add(obj2);
  60.  
  61.                 if (prop.PropertyType.IsClass && prop.PropertyType != typeof(string))
  62.                 {
  63.                     foreach (var prop2 in GetPropertyValues(prop.PropertyType, obj2))
  64.                     {
  65.                         result.Add(prop2);
  66.                     }
  67.                 }
  68.             }
  69.  
  70.             return result;
  71.         }
  72.  
  73.         public Dictionary<string, object> GetPropertyNamesAndValues()
  74.         {
  75.             Dictionary<string, object> result = new Dictionary<string, object>();
  76.  
  77.             foreach (var kv in GetPropertyNamesAndValues(GetType(), this))
  78.                 result.Add(kv.Key, kv.Value);
  79.  
  80.             return result;
  81.         }
  82.  
  83.         public Dictionary<string, object> GetPropertyNamesAndValues(Type type, object obj)
  84.         {
  85.             Dictionary<string, object> result = new Dictionary<string, object>();
  86.  
  87.             PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
  88.  
  89.             foreach (var prop in properties)
  90.             {
  91.                 var obj2 = prop.GetValue(obj);
  92.                 result.Add(prop.Name, obj2);
  93.  
  94.                 if (prop.PropertyType.IsClass && prop.PropertyType != typeof(string))
  95.                     foreach (var prop2 in GetPropertyNamesAndValues(prop.PropertyType, obj2))
  96.                         result.Add(prop.Name + "." + prop2.Key, prop2.Value);
  97.             }
  98.  
  99.             return result;
  100.         }
  101.  
  102.         public void Print()
  103.         {
  104.             //foreach(var prop in GetPropertyNames())
  105.             //{
  106.             //    Console.WriteLine(prop);
  107.             //}
  108.  
  109.             //foreach (var val in GetPropertyValues())
  110.             //{
  111.             //    Console.WriteLine(val);
  112.             //}
  113.  
  114.             foreach (var prop in GetPropertyNamesAndValues())
  115.             {
  116.                 Console.WriteLine(prop.Key + ": " + prop.Value);
  117.             }
  118.         }
  119.     }
  120.  
  121.     class Class2
  122.     {
  123.         public int Prop1 { get; set; } = 6;
  124.         public byte Prop2 { get; set; } = 7;
  125.         public long Prop3 { get; set; } = 8;
  126.         public float Prop4 { get; set; } = 9;
  127.         public Class3 Prop5 { get; set; } = new Class3();
  128.         public string Prop6 { get; set; } = "458enb57enb5e";
  129.     }
  130.  
  131.     class Class3
  132.     {
  133.         public int Prop1 { get; set; }
  134.         public byte Prop2 { get; set; }
  135.         public long Prop3 { get; set; }
  136.         public float Prop4 { get; set; }
  137.         public string Prop6 { get; set; }
  138.     }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы