Отладочная печать полей и свойств, помеченных атрибутом помеченных атрибутом 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); } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д