атрибуты c # и generic - список - PullRequest
0 голосов
/ 20 июня 2011

У меня есть такой общий класс списка:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Lab7
{
    public class MyListClass<T>: IEnumerable<T>
    {
        public delegate void MyDelegate();
        public event MyDelegate AddEvent;
        public event MyDelegate RemEvent;   

        List<T> list;

        public T this[int index]
        {
            get { return list[index]; }
            set { list[index] = value; }
        }

        public void Add(T item)
        {
            list.Add(item);
            if (AddEvent != null)
                AddEvent();   
        }

        public void Remove(T item)
        {
            list.Remove(item);
            if (RemEvent != null)
                RemEvent();   
        }

        public void RemoveAt(int index)
        {
            list.RemoveAt(index);
            if (RemEvent != null)
                RemEvent();   
        }

        public MyListClass()
        {
            list = new List<T>();
        }

        public MyListClass(List<T> list)
        {
            this.list = list;
        }

        public IEnumerator<T> GetEnumerator()
        {
            return list.GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return list.GetEnumerator();
        }

        #region Events
        /*static void AddHandler()
        {
            Console.WriteLine("Объект добавлен в коллекцию"); 
        }
        static void RemoveHandler()
        {
            Console.WriteLine("Объект удалён из коллекции коллекцию");
        }*/
        #endregion

    }
}

Где я должен поместить атрибут, чтобы записать что-то в разные классы, в соответствии с типом этого списка?Как мне написать этот атрибут?

Я не понял смысла атрибутов в этой лабораторной работе.

Если вы хотите просмотреть всю лабораторную работу, она здесь

Напишите общий класс списка с возможностью генерировать события при вызове некоторых методов класса.Информация о событиях должна быть записана в некоторых файлах, что должно быть определено прикрепленным к этому атрибуту класса.

Ответы [ 2 ]

1 голос
/ 20 июня 2011

Если я правильно понимаю, вас просят записать в указанный файл информацию о событиях, вызванных при вызове некоторых указанных методов.Этот файл должен быть указан через class уровень Attribute.

Я думаю (не легко понять, что вы спрашиваете), Attribute должен быть определен в универсальном типе T.

Если это то, что вы спрашиваете, я бы сделал что-то похожее на следующее:

  1. Определите ваш пользовательский атрибут:

    [AttributeUsage(AttributeTargets.Class)] 
    public class LogFileAttribute: Attribute
    {
        readonly string path;
    
        public LogFileAttribute(string path)
        {
            this.path = path;
        }
    
        public string Path { get { return this.path; } }
    }
    
  2. Измените класс вашего общего списка:

    public class MyListClass<T> : IEnumerable<T>
    {
         public delegate void MyDelegate();
         public event MyDelegate AddEvent;
         public event MyDelegate RemEvent;
         private LogFileAttribute logFileAttribute;
    
         List<T> list;
    
         public T this[int index]
         {
             get { return list[index]; }
             set { list[index] = value; }
         }
    
         public void Add(T item)
         {
             list.Add(item);
             if (AddEvent != null)
             {
                  AddEvent();
             }
             if (this.logFileAttribute != null)
             {
                 logEvent("Add");
             }
         }
    
         public void Remove(T item)
         {
             list.Remove(item);
             if (RemEvent != null)
             {
                 RemEvent();
             }
             if (this.logFileAttribute != null)
             {
                 logEvent("Remove");
             }
         }
    
         public void RemoveAt(int index)
         {
             list.RemoveAt(index);
             if (RemEvent != null)
             {
                 RemEvent();
            }
            if (this.logFileAttribute != null)
            {
                logEvent("RemoveAt");
            }
         }
    
         public MyListClass()
         {
             list = new List<T>();
             checkLogFileAttribute();
         }
    
         public MyListClass(List<T> list)
         {
             this.list = list;
             checkLogFileAttribute();
         }
    
         public IEnumerator<T> GetEnumerator()
         {
             return list.GetEnumerator();
         }
    
         IEnumerator IEnumerable.GetEnumerator()
         {
             return list.GetEnumerator();
         }
    
         private void logEvent(string methodName)
         {
             File.AppendAllLines(this.logFileAttribute.Path, new string[] { methodName + " called." });
         }
    
         private void checkLogFileAttribute()
         {
             object[] attributes = typeof(T).GetCustomAttributes(typeof(LogFileAttribute), false);
             if (attributes.Length > 0)
             {
                 this.logFileAttribute = (LogFileAttribute)attributes[0];
             }
         }
    
     }
    

Теперь, если вы определите следующий класс:

[LogFile(@"C:\EventLog.txt")]
public class Foo
{
    readonly int id;
    public Foo(int id)
    {
        this.id = id;
    }

    public int Id { get { return this.id; } }
}

И выполните следующий код:

MyListClass<Foo> foos = new MyListClass<Foo>();
foos.Add(new Foo(1));
foos.Add(new Foo(2));

вы получите желаемое поведение (если я правильно понял ваш вопрос).

РЕДАКТИРОВАТЬ: Удалено Append Форма LogFileAttribute, поскольку это не имеет никакого смысла вэтот контекст.

1 голос
/ 20 июня 2011

если я правильно расшифровал ваш вопрос, вам нужно что-то вроде этого:

[
YouFileDeterminant(@"c:\first.log"),
YouFileDeterminant(@"d:\second.log")
]
public class MyListClass<T>: IEnumerable<T>
{
...
}

затем перед запуском события вы должны получить эти атрибуты для определения файлов

...