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

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

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

Здравствуйте. Вопрос такой. Есть класс, например, public class Class1 в нем куча полей и свойств простых типов (риал, инт, стринг и тд) и есть поля и свойства типа Class2 (который может состоять как из простых типов, так и из классов) Нужны методы для получения всех имен свойств (если свойство является классом то необходимо вызывать рефлексию для него, и получить свойства из которых состоит этот класс) и для получения всех значений. Для получения имен я написал метод:
 public static void GetNamesOfClassProps1(Type clType, out string[] names)
        {
            PropertyInfo[] getsProp = clType.GetProperties(BindingFlags.Instance | BindingFlags.Public);
            int i = 0;
            string []names1 = new string[getsProp.Length];
            Type[] types = new Type[getsProp.Length];
 
            // Как избавится от константы в строчке ниже?
            string[] names2 = new string[2];
 
            string[] temp = new string[getsProp.Length+ names2.Length];
 
            foreach (PropertyInfo propInfo in getsProp)
            {
                names1[i] = propInfo.Name;
                types[i] = propInfo.PropertyType;
 
                if (types[i].IsClass == true)
                {
                    GetNamesOfClassProps1(types[i], out names2);
                }
                i += 1;
            }
 
            for (int j = 0; j < names1.Length; j++)
                temp[j] = names1[j];
 
            for (int j = 0; j < names2.Length; j++)
            {
                if (names2[j] != null)
                    temp[j + names1.Length] = names2[j];
            }
            names = temp;
        }
Правда, очень страшно выглядит, как бы сделать покрасивее? и избавится от константы? она все портит((( Для получения значений:
public static void ReadFromClassProps(object elClass, out object[] readed)
        {
            Type clType = elClass.GetType();
            PropertyInfo[] getsProp = clType.GetProperties(BindingFlags.Instance | BindingFlags.Public);
            readed = new object[getsProp.Length];
 
            int i = 0;
            foreach (PropertyInfo propInfo in getsProp)
            {
                if (propInfo.CanRead)
                {
                    readed[i] = propInfo.GetValue(elClass);
                }
 
                i += 1;
            }
        }
Тут не могу додумать, а как вызывать функцию для вложенного класса (как в примере с получением имен) В методе выше я передавал тип, а тут нужно передавать объект. как это сделать? Извиняюсь за глупый вопрос. Помогите, пожалуйста(((

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

textual
Листинг программы
    class Class1
    {
        public int Prop1 { get; set; } = 1;
        public byte Prop2 { get; set; } = 2;
        public long Prop3 { get; set; } = 3;
        public float Prop4 { get; set; } = 4.5f;
        public Class2 Prop5 { get; set; } = new Class2();
        public string Prop6 { get; set; } = "1234";
 
        public List<string> GetPropertyNames()
        {
            List<string> result = new List<string>();
 
            result.AddRange(GetPropertyNames(GetType()));
 
            return result;
        }
 
        public List<string> GetPropertyNames(Type type)
        {
            List<string> result = new List<string>();
 
            PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
 
            foreach(var prop in properties)
            {
                result.Add(prop.Name);
 
                if (prop.PropertyType.IsClass && prop.PropertyType != typeof(string))
                {
                    foreach(var prop2 in GetPropertyNames(prop.PropertyType))
                    {
                        result.Add(prop.Name + "." + prop2);
                    }
                }
            }
 
            return result;
        }
 
        public List<object> GetPropertyValues()
        {
            List<object> result = new List<object>();
 
            result.AddRange(GetPropertyValues(GetType(), this));
 
            return result;
        }
 
        public List<object> GetPropertyValues(Type type, object obj)
        {
            List<object> result = new List<object>();
 
            PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
 
            foreach (var prop in properties)
            {
                var obj2 = prop.GetValue(obj);
                result.Add(obj2);
 
                if (prop.PropertyType.IsClass && prop.PropertyType != typeof(string))
                {
                    foreach (var prop2 in GetPropertyValues(prop.PropertyType, obj2))
                    {
                        result.Add(prop2);
                    }
                }
            }
 
            return result;
        }
 
        public Dictionary<string, object> GetPropertyNamesAndValues()
        {
            Dictionary<string, object> result = new Dictionary<string, object>();
 
            foreach (var kv in GetPropertyNamesAndValues(GetType(), this))
                result.Add(kv.Key, kv.Value);
 
            return result;
        }
 
        public Dictionary<string, object> GetPropertyNamesAndValues(Type type, object obj)
        {
            Dictionary<string, object> result = new Dictionary<string, object>();
 
            PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
 
            foreach (var prop in properties)
            {
                var obj2 = prop.GetValue(obj);
                result.Add(prop.Name, obj2);
 
                if (prop.PropertyType.IsClass && prop.PropertyType != typeof(string))
                    foreach (var prop2 in GetPropertyNamesAndValues(prop.PropertyType, obj2))
                        result.Add(prop.Name + "." + prop2.Key, prop2.Value);
            }
 
            return result;
        }
 
        public void Print()
        {
            //foreach(var prop in GetPropertyNames())
            //{
            //    Console.WriteLine(prop);
            //}
 
            //foreach (var val in GetPropertyValues())
            //{
            //    Console.WriteLine(val);
            //}
 
            foreach (var prop in GetPropertyNamesAndValues())
            {
                Console.WriteLine(prop.Key + ": " + prop.Value);
            }
        }
    }
 
    class Class2
    {
        public int Prop1 { get; set; } = 6;
        public byte Prop2 { get; set; } = 7;
        public long Prop3 { get; set; } = 8;
        public float Prop4 { get; set; } = 9;
        public Class3 Prop5 { get; set; } = new Class3();
        public string Prop6 { get; set; } = "458enb57enb5e";
    }
 
    class Class3
    {
        public int Prop1 { get; set; }
        public byte Prop2 { get; set; }
        public long Prop3 { get; set; }
        public float Prop4 { get; set; }
        public string Prop6 { get; set; }
    }

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

7   голосов , оценка 4.286 из 5
Похожие ответы