开发者

question about reflection, attributes in c#

开发者 https://www.devze.com 2023-03-14 05:10 出处:网络
I have such work to(lab) do: ... information about events must e written in some files, which must be determinated by attached to this class attribute.

I have such work to(lab) do: ... information about events must e written in some files, which must be determinated by attached to this class attribute. Wgat a sense is in this attribute? what it must to do?

All lab is "Write generic class of list with opportunity to generate events when you call some class methods. Information about events must e written in some files, which must be determinated by attached to this class attribute.

I don't understand reason of using in this lab attribute, please help me.

Here I have written sample generic class of list

Here are two files:

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

    }
}

and here is main class:

usin开发者_JAVA百科g 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("Объект удалён из коллекции коллекцию");
        }
    }
}

Sorry for my bad English. I don't say to do all lab for me, only give me ideas, and examples how to write this)


The question is difficult to understand, but I think it wants you do decorate your class or methods with an attribute which points to a file in which some sort of event data is stored.

So it would look something like this:

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

So you need to define an attribute:

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

How you store the event information and implement the events is up to you.

Your code would have to use reflection to discover the attribute on the methods.

For example:

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 ...
            }
        }
    }
}

This is a simplified example to give you an idea of the direction to go in.

0

精彩评论

暂无评论...
验证码 换一张
取 消