关于反射的问题,c#中的属性

本文关键字:属性 反射的 问题 | 更新日期: 2023-09-27 17:59:22

我有这样的工作要做(实验室):…有关事件的信息必须写入某些文件中,这些文件必须通过附加到此类属性来确定。这个属性有什么意义?它必须做什么?

所有实验室都是"编写列表的泛型类,当你调用一些类方法时,有机会生成事件。关于事件的信息必须写在一些文件中,这些文件必须通过附加到这个类属性来确定。

我不明白在这个实验室使用属性的原因,请帮帮我。

在这里,我已经写了列表的示例通用类

这里有两个文件:

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("Объект удалён из коллекции коллекцию");
        }
    }
}

抱歉我英语不好。我没有说要为我做所有的实验室,只给我一些想法和例子如何写这个)

关于反射的问题,c#中的属性

这个问题很难理解,但我认为它希望您用一个指向存储某种事件数据的文件的属性来装饰类或方法。

所以它看起来像这样:

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

这是一个简化的例子,可以让您了解进入的方向。