Отладочная печать полей и свойств, помеченных атрибутом помеченных атрибутом DebugPrintAttribute - C#

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

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

Описать пользовательский атрибут «DebugPrintAttribute», содержащий одно свойство (и один параметр конструктора) с именем «Format» (значение свойства по умолчанию – «{0}»). Разработать утилитарный класс «ReflLab» содержащий статическую функцию «DebugPrint», принимающей на вход экземпляр произвольного класса и реализующую алгоритм отладочной печати полей и свойств полученного объекта, помеченных атрибутов «DebugPrintAttribute». Значение для каждого поля/свойства должно выводиться в отдельной строке. Формат вывода должен соответствовать свойству «Format» атрибута «DebugPrintAttribute». При формировании строки для вывода в качестве первого (нулевого) параметра передавать значение поля/свойства, в качестве второго (первого) – его имя, а в качестве третьего (второго) – имя класса, в котором описано поле/свойство.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Threading.Tasks;
 
namespace Tane
{
   [AttributeUsage(AttributeTargets.All)]
 
    public class DebugPrintAttribute: Attribute
    {
        public string formatt;
 
       public DebugPrintAttribute(string formatt)
        {
            this.formatt = formatt;
        }

        public virtual string Formatt ///Свойство для чтения и записи
       {
           get
           {
               return formatt;
           }
           set
           {
               formatt = "{0}";
           }
        }
 
    }
  
    [DebugPrintAttribute("Testing Test Tester")]
    public class RefLab
    {
 
        public static void DebugPrint(Type myType,RefLab rf)
        {         
          MemberInfo[] myMembers = myType.GetMembers();
            for (int i = 0; i < myMembers.Length; i++)
            {
                Object[] myAttributes = myMembers[i].GetCustomAttributes(true);
                for (int j = 0; j < myAttributes.Length; j++)
                {
                    if (myAttributes[j].ToString() == "Tane.DebugPrintAttribute")
                    {
                        if (myAttributes.Length > 0)
                        {
                            if (myMembers[i].MemberType.ToString() == "Property")
                            {
                             String.Format("format {0},{1},{2}", myMembers[i].MemberType.ToString(), myMembers[i], (myType.GetField(myMembers[i].Name.ToString())).GetValue(rf));              
                           }
                            else
                            {
                              String.Format("format {0},{1},{2}",  myMembers[i].MemberType.ToString(), myMembers[i], myType.GetProperty(myMembers[i].Name.ToString()).GetValue(rf));
                              
                            }
                        }
                    }
                }
            }
        }
    }
 
    class Program
    {
 
        static void Main(string[] args)
        {
            RefLab rf = new RefLab();
            Type myType = typeof(RefLab);            
            RefLab.DebugPrint(myType,rf);
            Console.ReadKey();
        }
    }
}
Можно и неутилитарный класс,главная проблема что не запускается.
Переделал под статический,Всё также.. Пошагово он только в мэйне бегает,что в переменных выдаёт неизвестно,использую шаг с заходом в программу
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Threading.Tasks;
 
namespace Tane
{
 
[AttributeUsage(AttributeTargets.Property|AttributeTargets.Field|AttributeTargets.Class)]
    public class DebugPrintAttribute: Attribute
    {
        public string formatt;
 
       public DebugPrintAttribute(string formatt)
        {
            this.formatt = formatt;
        }
 
    [DebugPrintAttribute("Test")]
        public virtual string Formatt ///Свойство для чтения и записи
       {
           get
           {
               return formatt;
           }
           set
           {
               formatt = "{0}";
           }
        }
    }
   
    public static class RefLab
    {
        public static void DebugPrint()
        {
            Type myType = typeof(RefLab);
           MemberInfo[] myMembers = myType.GetMembers();
            for (int i = 0; i < myMembers.Length; i++)
            {
                Object[] myAttributes = myMembers[i].GetCustomAttributes(true);
                for (int j = 0; j < myAttributes.Length; j++)
                {
                    if (myAttributes[j].ToString() == "Tane.DebugPrintAttribute")
                    {
                        if (myAttributes.Length > 0)
                        {
                            if (myMembers[i].MemberType.ToString() == "Property")
                            {      
                                Console.WriteLine("{0} {1} = {2}", myMembers[i].MemberType.ToString(), myMembers[i], (myType.GetField(myMembers[i].Name.ToString())));           
                            }
                            else
                            {
                               Console.WriteLine("{0} {1} = {2}", myMembers[i].MemberType.ToString(), myMembers[i], myType.GetProperty(myMembers[i].Name.ToString()));
                            }
                        }
                    }
                }
            }
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {       
            RefLab.DebugPrint();
            Console.ReadKey();
        }
    }
}

Решение задачи: «Отладочная печать полей и свойств, помеченных атрибутом помеченных атрибутом DebugPrintAttribute»

textual
Листинг программы
using System;
using System.Linq;
using System.Reflection;
 
namespace ConsoleApplication1
{
    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
    class DebugPrintAttribute : Attribute
    {
        public readonly string Format;
        public DebugPrintAttribute(string format)
        {
            Format = format;
        }
 
        public DebugPrintAttribute()
            : this("{0}")
        {
 
        }
    }
 
    class Point
    {
        [DebugPrint("Prop {1}\tValue = {0}")]
        public int X { get; set; }
 
        [DebugPrint]
        public int Y { get; set; }
        
        [DebugPrint("{2}.{1} = {0}")]
        public int Z { get; set; }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            var point = new Point() {X = 5, Y = 10, Z = 20};
            RefLab.DebugPrint(point);
        }
    }
 
    public static class RefLab
    {
        public static void DebugPrint(object obj)
        {
            Type type = obj.GetType();
            foreach (var p in type.GetProperties())
            {
                var custom = p.GetCustomAttributes(typeof(DebugPrintAttribute)).FirstOrDefault() as DebugPrintAttribute;
                if (custom != null)
                    Console.WriteLine(custom.Format, p.GetValue(obj), p.Name, type.Name);
            }
        }
    }
}

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


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

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

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