浅学泛型委托

委托 可以定义自己的类型参数。

引用泛型委托的代码可以指定类型参数以创建已关闭的构造类型,就像实例化泛型类或调用泛型方法一样,如下例所示:

publicdelegatevoid Del<T>(T item);
publicstaticvoid Notify(int i) { }

Del<int> m1 = new Del<int>(Notify);s

C# 2.0 版具有称为方法组转换的新功能,此功能适用于具体委托类型和泛型委托类型,并使您可以使用如下简化的语法写入上一行:

Del<int> m2 = Notify;

由于对泛型委托理解的不够深刻,所以根据网络资料做了一个小例子,新建一个控制台应用程序:

首先,定义一个没有返回值的泛型委托:

 public delegate void TDelegateEventHandler<ParamOne,ParamTwo>(ParamOne paramone,ParamTwo paramtwo);

然后定义两个不同的类,他们包含两个不同的事件,但该事件的类型都是同一个委托----这个泛型委托:

 public class TestClassEventArgs : EventArgs
    {
        public string message;
        public TestClassEventArgs(string message)
        {
            this.message = message;
        }
    }

    class TestClass
    {
        public string identifier = "TestClassOne";
        public event TDelegateEventHandler<TestClass, TestClassEventArgs> TestClassEvent;  //定义一个事件
        
        protected virtual void OnTestClassEvent(TestClassEventArgs e)
        {
            if (TestClassEvent != null)   //判断是否触发事件
            {
                TestClassEvent(this, e);
            }

        }

        public void MessageArrive(string message)
        {
            TestClassEventArgs e = new TestClassEventArgs(message);
            OnTestClassEvent(e);
        }
    }

现在,来看怎么使用泛型委托:

 class Program
    {
        static void Main(string[] args)
        {
            TestClass one = new TestClass();
            one.TestClassEvent += new TDelegateEventHandler<TestClass, TestClassEventArgs>(one_TestClassEvent); //注册事件
            one.MessageArrive("Hello");

            TestClassTwo two = new TestClassTwo();
            two.TestClassEvent += new TDelegateEventHandler<TestClassTwo, TestClassEventArgs>(two_TestClassEvent);
            two.MessageArrive("TwoHello");
        }

        static void two_TestClassEvent(TestClassTwo paramone, TestClassEventArgs paramtwo)
        {
            Console.WriteLine(paramone.identifier + "has received message:" + paramtwo.message);
            Console.ReadLine();
        }

        static void one_TestClassEvent(TestClass paramone, TestClassEventArgs paramtwo)
        {
            Console.WriteLine(paramone.identifier + "has received message:" + paramtwo.message);
            Console.ReadLine();
        }
    }

好啦!这样就是一个泛型委托的应用啦!

posted @ 2011-02-09 11:43  佳园  阅读(298)  评论(0)    收藏  举报