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





3.00/5 (1投票)
2006 年 2 月 17 日
3分钟阅读

32585

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# 的所有示例和代码的回馈的第一篇文章。我一定是最大的下载者。
请给我您的评论,这就是我学习的方式!