вопрос об отражении, атрибуты в c # - PullRequest
0 голосов
/ 18 июня 2011

У меня есть такая работа, чтобы (лаборатория) выполнить: ... информация о событиях должна быть записана в некоторых файлах, которые должны определяться прикрепленным к этому атрибуту класса.Wgat смысл в этом атрибуте?что он должен делать?

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

Я не понимаю причину использования в этом лабораторном атрибуте, пожалуйста, помогите мне.

Здесь я написал пример универсального класса списка

Вотдва файла:

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

    }
}

и вот основной класс:

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

namespace Lab7
{
    class Program
    {
        static void Main(string[] args)
        {
            MyListClass<int> lst = new MyListClass<int>();
            lst.AddEvent +=new MyListClass<int>.MyDelegate(AddHandler);
            lst.RemEvent+=new MyListClass<int>.MyDelegate(RemoveHandler);
            lst.Add(2542);
            lst.Add(785);
            lst.RemoveAt(1);
        }
        static void AddHandler()
        {
            Console.WriteLine("Объект добавлен в коллекцию");
        }
        static void RemoveHandler()
        {
            Console.WriteLine("Объект удалён из коллекции коллекцию");
        }
    }
}

Извините за мой плохой английский. Я не говорю, чтобы сделать все лабораторные работы для меня, только дать мне идеи,и примеры как это написать)

1 Ответ

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

Вопрос сложен для понимания, но я думаю, что он хочет, чтобы вы украсили свой класс или методы атрибутом, который указывает на файл, в котором хранятся какие-то данные о событиях.

Так это будет выглядеть примерно так:

class SomeClass
{
    [MyEventInfoAttribute(EventFile = "c:\\blah\\events.foo")]
    void SomeMethod()
    {
    }
}

Итак, вам нужно определить атрибут:

public class MyEventInfoAttribute : Attribute
{
    public property string EventFile { get; set; }
}

Как вы храните информацию о событиях и осуществляете их, зависит от вас.

Ваш код должен будет использовать отражение, чтобы обнаружить атрибут методов.

Например:

class SomeClass
{
    [MyEventInfoAttribute(EventFile = "c:\\blah\\events.foo")]
    void SomeMethod()
    {    
        Type type = typeof(SomeClass);
        MethodInfo method = type.GetMethod("SomeMethod");
        object[] atts = method.GetCustomAttributes();
        if (atts.Length > 0)
        {
            if (atts[0] is MyEventInfoAttribute)
            {
                string fileName = ((MyEventInfoAttribute)atts[0]).EventFile;

                ... now open the file, read the event info, and use it ...
            }
        }
    }
}

Это упрощенный пример, чтобы дать вам представление о направлении движения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...