泛型委托[转]
我们知道,委托是类型安全的方法的引用,通过泛型委托,委托的参数可以以后定义,不如.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;
});
转自:杨平

浙公网安备 33010602011771号