在.NET中,在使用委托前,需要使用delegate关键字来定义委托,然后在实例化,再执行之。
在每次使用前,都需要定义该委托类型,稍嫌麻烦和多余。
在.NET 4.0中,有了如下的几个泛型委托,就省去了您定义委托的麻烦了。
分别有:
public delegate void Action(); public delegate void Action<in T>(T obj);
public delegate void Action<in T1, in T2>( T1 arg1, T2 arg2 );
Action<T1, T2, T3>
Action<T1, T2, T3, T4>
依次类推,直到共有16个输入参数的泛型委托,在这点上,微软是不是也挺仗义的,不过,还有呢。
除了不带返回值的这16个泛型委托的定义,还有带返回值的16个泛型委托
public delegate TResult Func<out TResult>();
public delegate TResult Func<in T, out TResult>(
T arg
);
public delegate TResult Func<in T1, in T2, out TResult>(
T1 arg1,
T2 arg2
);
依次类推,也是共有16个泛型委托。
这下基本上就满足了所有常用的委托定义了。
下面列举一个把匿名方法和泛型委托一块使用,来解决在另外一个线程中更新控件的例子
private void LoadDBData()
{
DBInfoLogic dbLogic = new DBInfoLogic();
this.DBList = dbLogic.GetDBInfoByCategoryID(null);
Action<List<DBInfoModel>> setControl = delegate(List<DBInfoModel> dbList)
{
TreeNode nodeHome = this.tvMain.Nodes["HOME"];
TreeNode nodeDB = nodeHome.Nodes["DB"];
if (nodeDB == null) return;
nodeDB.Nodes.Clear();
foreach (DBInfoModel db in dbList)
{
nodeDB.Nodes.Add(db.DBInfoID.ToString(), db.DBName);
}
};
//填充左侧树节点
if (this.tvMain.InvokeRequired)
{
this.tvMain.BeginInvoke(setControl, this.DBList);
}
else
{
setControl(this.DBList);
}
}
这样就需要在另外定义个委托(使用泛型委托代替)和一个执行函数(使用匿名方法代替)了,代码是不是简练了很多。