Задать вопрос
  • Как вывести список всех свойств и всё что с ними связано?

    @Glebster13 Автор вопроса
    Всем привет, я сам пришёл к решению. Выкладываю решение своего же вопроса, вдруг кому пригодится.
    using System;
    using System.Reflection;
    using System.Linq;
    
    namespace _123
    {
        [AttributeUsage((AttributeTargets.Method))] //атрибут на метод
        public class HiddenMethod : System.Attribute
        {
    
        }
        [AttributeUsage((AttributeTargets.Property))] //атрибут на свойство
        public class HiddenProperty : System.Attribute
        {
    
        }//Вообще атрибуты сверху можно заменить одним, 
         //просто в качестве параметра AttributeUsage прописать 
         //(AttributeTargets.Method || AttributeTargets.Property)
        public class ReflectClass //перечисление методов и свойств
        {
            double d, f;
            [HiddenProperty]
            public string DefaultMessage { get; set; } = "Hello world"; //Свойства
    
            public string SecondMessage { get; set; } = "Hi";
    
            public string ThirdMessage { get; set; } = "Bye";
            public ReflectClass(double d, double f) //к конструктору нельзя применять атрибуты
            {
                this.d = d;
                this.f = f;
            }
            public double MyTest(double d, double f) //Методы
            {
                return d + f;
            }
            [HiddenMethod]
            public void Set1(double d, double f)
            {
    
            }
            public void Set2(double d, double f)
            {
    
            }
            public void Set3(double d, double f)
            {
    
            }
            public static void MethodReflectInfo<T>(T obj) where T : class //основной класс
            {
                Type t = typeof(T);//Определение типа
                Console.WriteLine("Список методов класса {0}\n", obj.ToString());
                var meths = t.GetMethods().Where(p => !p.GetCustomAttributes<HiddenMethod>().Any() && !p.Name.Contains("get_") && !p.Name.Contains("set_")).ToList();
                foreach (MethodInfo m in meths) //поиск методов
                {
                    //if ((!(m.GetCustomAttribute<HiddenMethod>() == null)) && (!(m.Name.Contains("_get"))) && (!(m.Name.Contains("_set"))))//проверка
                    //{
                        Console.Write("-->" + m.ReturnType.Name + " \t" + m.Name + "(");
                        ParameterInfo[] p = m.GetParameters();
                        for (int i = 0; i < p.Length; i++)
                        {
                            Console.Write(p[i].ParameterType.Name + " " + p[i].Name);
                            if (i + 1 < p.Length)
                            {
                                Console.Write(", ");
                            }
                        }
                        Console.Write(")\n");
                    //}
                }
                Console.WriteLine("Список свойств класса {0}\n", obj.ToString());
                var props = t.GetProperties().Where(p => !p.GetCustomAttributes<HiddenProperty>().Any()).ToList();
                foreach (PropertyInfo m in props) //поиск свойств
                {
    
                    //if (((m.GetCustomAttribute<HiddenProperty>() != null)) || (m.Name.Contains("_get") || (m.Name.Contains("_set"))))//проверка
                    //{
                        Console.Write("-->" + " \t" + m.Name + " \t" + " Can read:" + m.CanRead + " \t" + " Can write:" + m.CanWrite);
                        Console.Write("\n");
                    //}
                }
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                ReflectClass mts = new ReflectClass(12.0, 3.5);
                ReflectClass.MethodReflectInfo<ReflectClass>(mts);
                Console.ReadLine();
    
            }
        }
    }
    Ответ написан
    Комментировать