泛型委托[转]

我们知道,委托是类型安全的方法的引用,通过泛型委托,委托的参数可以以后定义,不如.NET库中定义的事件泛型委托:

public sealed delegate void EventHandler<TEventArgs>(object sender, TEventArgs e)
where TEventArgs : EventArgs;

它的第二个参数是TEventArgs泛型类型,并且将该泛型类型添加了约束——就规定了TEventArgs泛型类型必须派生自EventArgs类。

接下来,我们看看一个例子,说明泛型委托的好处:

首先创建一个个人账户信息类(只包含姓名和工薪字段):

public class Account
{
private String name;
public String Name
{
get { return name; }
}
private decimal balance;
public decimal Balance
{
get { return balance; }
}
public Account(String name, Decimal balance)
{
this.name = name;
this.balance = balance;
}
}

然后再创建一个统计所有薪水的类:

public class Algorithm
{
public decimal AccumulateSimple(IEnumerable e)
{
decimal sum = 0;
foreach(Account a in e)
{
sum += a.Balance;
}
return sum;
}
}

主函数中这样的调用:

class Program
{
static void Main()
{
List<Account> accounts = new List<Account>();
accounts.Add(new Account("Name1", 2500));
accounts.Add(new Account("Name2", 4500));
accounts.Add(new Account("Name3", 2000));

Algorithm alg = new Algorithm();
alg.AccumulateSimple(accounts);
}
}

 


 

但是,这样我们会发现,这只能统计Account类型的数据了,接下来使用泛型委托灵活的改变统计的范围了。

public delegate TSummary Action<TInput, TSummary>(TInput t, TSummary s);//定义一个泛型委托

然后再在Algorithm 类中定义一个泛型方法:

public TSummary Accumulate<TInput, TSummary>(IEnumerable<TInput> coll, Action<TInput, TSummary> action)
{
TSummary sum = default(TSummary);
foreach (TInput input in coll)
{
sum = action(input, sum);
}
return sum;
}

最后,我们就可以在Main函数中这样调用了:

alg.Accumulate<Account, decimal>(accounts, 
delegate(Account a, decimal d)
{
return a.Balance + d;
});


转自:杨平

posted @ 2012-02-17 15:15  疯狂科学家  阅读(235)  评论(0)    收藏  举报