65.9K
CodeProject 正在变化。 阅读更多。
Home

DelegateTypeT 使委托的使用变得轻而易举!

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (1投票)

2006 年 2 月 17 日

3分钟阅读

viewsIcon

32585

downloadIcon

207

DelegateTypeT,一个委托的包装类,使用简单。

引言

DelegateTypeTClass 提供了一种简单易懂的机制来处理委托。

背景

关于委托和事件的文章已经很多了。有些更好,有些不太容易理解。无论如何,尝试实现一个简单的委托队列让我反复翻阅自己的代码和文章,试图理解需要做什么以及以什么顺序进行。由于我需要能够使用一个动态的方法队列来对同一组数据执行操作,我决定使用 .NET 2.0 的优秀泛型特性,并实现一个泛型委托类来为我处理细节。我也认为这个类的实现展示了一个很好的、简短的示例,说明了如何使用委托。

使用代码

要使用 DelegateTypeTClass,只需为 DelegateTypeT 添加一个 using 指令,或者只包含源文件 DelegateTypeT.cs

包含的演示程序准确地展示了这一切是如何工作的。但还是让我来告诉你吧

假设您创建一个程序,该程序需要以几种不同的方式处理一些字符串列表,但这种处理方式将来可能会发生变化。您现在编写了您需要的处理器,并且可以在您的代码中按顺序调用它们。但是,当您需要添加新的处理步骤时,您将不得不更改主程序以包含新的处理步骤。这就是委托发挥作用的地方。

简单来说,委托只是一个方法的列表,每个方法都需要使用相同的(某种)输入来调用。

因此,通过使用委托,您的新处理类只需要将自己添加到该委托列表中即可。

演示程序使用两个处理器来处理字符串列表。第一个只是将列表打印到控制台,第二个处理器打印每个字符串的长度

static void Processor1(List<STRING> input)
{
    foreach (string ST in input)
    {
        Console.WriteLine(ST);
    }
}

static void Processor2(List<STRING> input)
{
    foreach (string ST in input)
    {
        Console.WriteLine(ST.Length);
    }
}

注意:它们不需要是静态的,我只是懒得写演示程序!

演示程序需要将以下信息写入控制台

List<STRING> test = new List<STRING>(args);
test.Add("This shows a test using the DelegateTypeTClass");
test.Add("May be this makes it easier to use and understand the");
test.Add("concept of delegates!");
test.Add("The list of string lengths is displayed twice, to showthe");
test.Add("removal of processors from the delegate queue)");

这将打印此列表中的所有字符串,每个字符串的长度,然后再次只打印长度列表。

使用 DelegateTypeTClass,这只需三个简单的步骤

步骤 1:创建具有所需类型的实例。

DelegateTypeT.DelegateTClass<LIST<STRING>> MyProcessors = 
            new DelegateTypeT.DelegateTClass<LIST<STRING>>();

步骤 2:添加您的委托处理程序。

MyProcessors.Add(Processor1);
MyProcessors.Add(Processor2);

步骤 3:调用委托过程。

MyProcessors.InvokeDelegates(test);

仅此而已!

然而,演示程序需要打印两次长度列表,并且由于我们展示了委托的动态特性,我们删除了第一个处理器(打印字符串的那个)并再次调用委托(然后只包含 Processor2)。

MyProcessors.Remove(Processor1);
MyProcessors.InvokeDelegates(test);

当然,您也可以用“老方法”来做

MyProcessors.DelegatesToInvoke += 
    new DelegateTypeT.DelegateTClass<LIST<STRING>>.DelegateSignature(Processor1);

并同样使用 -= 运算符来移除。

类中的代码非常简单,为了方便起见,在此列出

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

namespace DelegateTypeT
{
    /// <SUMMARY>
    /// A generic Multicast Delegate handling class
    /// provides an easy interface for working with delegates
    /// i.e. use a list of methods to process some data or 
    /// perform some functions
    /// This class handles only one parameter in the method signature
    /// <TYPEPARAM name="T"></TYPEPARAM>
    /// </SUMMARY>
    public class DelegateTClass<T>
    {
        /// <SUMMARY>
        /// Define the method signature
        /// </SUMMARY>
        /// <PARAM name="input"></PARAM>
        public delegate void DelegateSignature(T input);
        /// <SUMMARY>
        /// The delegates invocation list, used as:
        /// DelegateTClass.DelegatesTo Invoke += new
        ///      DelegateTClass<T>.DelegateSignature(Check2)
        /// To discourage use defined as private
        /// Or: DelegateTypeTClass.Add(methodname)
        /// </SUMMARY>
        public DelegateSignature DelegatesToInvoke;
        /// <SUMMARY>
        /// Execute the delegates in the order added to DelegatesToInvoke
        /// </SUMMARY>
        /// <PARAM name="input"></PARAM>
        public void InvokeDelegates(T input)
        {
            DelegatesToInvoke(input);
        }
        /// <SUMMARY>
        /// Constructor
        /// </SUMMARY>
        public DelegateTClass() {}

        /// <SUMMARY>
        /// Add a method to the DelegatesToInvoke list by just
        /// referencing the method name
        /// For Instance: MyDelegate = new DelegateTypeTClass(List<STRING>)
        ///               void  MyProcessor(List<STRING> line)
        ///                         { Console.Writeline(line); }
        ///               MyDelegate.Add(MyProcessor);
        /// </SUMMARY>
        /// <PARAM name="P"></PARAM>
        public void Add(DelegateSignature P)
        {
            DelegatesToInvoke += P;
        }
        public void Remove(DelegateSignature P)
        {
            DelegatesToInvoke -= P;
        }
    }
}

历史

这是我作为对从 CodeProject 学习 C# 的所有示例和代码的回馈的第一篇文章。我一定是最大的下载者。

请给我您的评论,这就是我学习的方式!

© . All rights reserved.