Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2015, 17:04   #1
Otar4ik
Форумчанин
 
Регистрация: 16.04.2010
Сообщений: 123
По умолчанию Создал атрибут и не запускается,выходит тёмная консоль..

Описать пользовательский атрибут «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();
        }
    }
}

Последний раз редактировалось Stilet; 11.10.2015 в 17:30.
Otar4ik вне форума Ответить с цитированием
Старый 11.10.2015, 17:31   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

А где у тебя вывод в консоль описан? Чет я его не вижу.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.10.2015, 17:45   #3
Otar4ik
Форумчанин
 
Регистрация: 16.04.2010
Сообщений: 123
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А где у тебя вывод в консоль описан? Чет я его не вижу.
С Console.Writeline тоже ничего не выводит

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Threading.Tasks;

namespace Tane
{
   [AttributeUsage(AttributeTargets.All)]

//[AttributeUsage(AttributeTargets.Property|AttributeTargets.Field|AttributeTargets.Class)]
    public class DebugPrintAttribute: Attribute
    {
        public string formatt;

       public DebugPrintAttribute(string formatt)
        {
            this.formatt = formatt;
        }

    
        public virtual string Formatt ///Свойство для чтения и записи
       {
           get
           {
               return formatt;
           }
           set
           {
               formatt = "{0}";
           }
        }

    }
   
    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));              
                                Console.WriteLine("{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));
                               Console.WriteLine("{0} {1} = {2}", myMembers[i].MemberType.ToString(), myMembers[i], 
                                       myType.GetProperty(myMembers[i].Name.ToString()).GetValue(rf));
                            }
                        }
                    }
                }
            }
        }
    }

    class Program
    {
        [DebugPrintAttribute("Testing Test Tester")]
        static void Main(string[] args)
        {
            RefLab rf = new RefLab();
            Type myType = typeof(RefLab);            
            RefLab.DebugPrint(myType,rf);
            Console.ReadKey();
        }
    }
}

Последний раз редактировалось Stilet; 11.10.2015 в 18:20.
Otar4ik вне форума Ответить с цитированием
Старый 11.10.2015, 18:22   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
тоже ничего не выводит
Дык проверь что дает myMembers.Length и myAttributes.Length.
Уж не нули ли?
Вот что это?:
Цитата:
RefLab rf = new RefLab();
Type myType = typeof(RefLab);
Я например не смог понять эти две строки.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.10.2015, 18:42   #5
Otar4ik
Форумчанин
 
Регистрация: 16.04.2010
Сообщений: 123
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Дык проверь что дает myMembers.Length и myAttributes.Length.
Уж не нули ли?
Вот что это?:

Я например не смог понять эти две строки.
1-ая - это объект класса RefLab
2-ая передаём тип класса для применения механизма рефлексии,в методах указанных выше.


Там не могут быть нули,я передаю строку в поле formatt и атрибут должен вывести какой класс и что за строка.
В любом случае он должен хоть что-то вывести даже если по нулям было бы.
Otar4ik вне форума Ответить с цитированием
Старый 11.10.2015, 20:31   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
В любом случае он должен хоть что-то вывести даже если по нулям было бы.
Это как так? У тебя весь вывод упакован в цикл. А условия цикла - непустая коллекция. Если у тебя в коллекции ничего нет, то и вывода никак быть не может
Поставь бряк на те условия, запусти прогу и посмотри чему равны длины.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.10.2015, 21:23   #7
Otar4ik
Форумчанин
 
Регистрация: 16.04.2010
Сообщений: 123
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Это как так? У тебя весь вывод упакован в цикл. А условия цикла - непустая коллекция. Если у тебя в коллекции ничего нет, то и вывода никак быть не может
Поставь бряк на те условия, запусти прогу и посмотри чему равны длины.
Ничего не видно,пустота хотя я в атрибут передавал поле formatt

Хорошо,а как можно исправить мою ошибку?Чтобы было по заданию.

Мне интересн алгоритм,даже словами если скажете и то хорошо,я код не прошу.
Otar4ik вне форума Ответить с цитированием
Старый 11.10.2015, 21:48   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Я не знаю, если честно, правильного ответа на твой вопрос, я не работал с доступам к типам с шарпее.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Атрибут required victor5133 HTML и CSS 1 04.12.2014 19:34
Почему не меняется атрибут ? Heng JavaScript, Ajax 2 13.11.2013 17:49
Андроид - тёмная лошадка Ципихович Эндрю Свободное общение 17 22.10.2013 14:57
атрибут файла shelest Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 16.11.2012 11:40
Атрибут tittle Anton HTML и CSS 1 15.11.2012 18:55