Отладочная печать полей и свойств, помеченных атрибутом помеченных атрибутом 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);
}
}
}
}