我正在阅读一本书,该书使用委托关键字(根据我的理解)作为要封装在委托中的函数的名称(使用委托对象名称/构造函数调用的那个)。下面是代码:
//Declaration of delegate object AppendChildData
public delegate void AppendChildData(T entityAggregate, object childEntityKeyValue);
//Dictionary of Delegate Objects
private Dictionary<string, AppendChildData> childCallbacks;
//Creation of dictionary object inside constructor of containing class. Also calling the BuildChildCallbacks() function
protected SqlRepositoryBase(IUnitOfWork unitOfWork)
: base(unitOfWork)
{
this.childCallbacks = new Dictionary<string, AppendChildData>();
this.BuildChildCallbacks();
//Other Initializations
}
protected override void BuildChildCallbacks()
{
this.childCallbacks.Add("allowances", delegate(Project project, object childKeyName)
{
this.AppendProjectAllowances(project);
});
}
现在如果仔细看过:
delegate(Project project, object childKeyName)
{
this.AppendProjectAllowances(project);
});
已在BuildChildCallbacks()函数中声明为字典childCallBacks的值。字典childCallBacks的这个值是一个名为delegate()的函数。为什么?在这种情况下,.NET如何使用委托关键字?
我正在关注的书也使用函数名而不是使用委托关键字,BuildChlidCallBack的完整代码如下:
protected override void BuildChildCallbacks()
{
this.ChildCallbacks.Add(ProjectFactory.FieldNames.OwnerCompanyId,
this.AppendOwner);
this.ChildCallbacks.Add(
ProjectFactory.FieldNames.ConstructionAdministratorEmployeeId,
this.AppendConstructionAdministrator);
this.ChildCallbacks.Add(ProjectFactory.FieldNames.PrincipalEmployeeId,
this.AppendPrincipal);
this.ChildCallbacks.Add("allowances",
delegate(Project project, object childKeyName)
{
this.AppendProjectAllowances(project);
});
this.ChildCallbacks.Add("contracts",
delegate(Project project, object childKeyName)
{
this.AppendContracts(project);
});
this.ChildCallbacks.Add("contacts",
delegate(Project project, object childKeyName)
{
this.AppendContacts(project);
});
}
仔细观察我知道,如果字典键不是外键(不是DataTable的列),并且调用这些委托将NULL传递给第二个参数,即委托的子句“childKeyName”,则使用委托关键字()功能。使用字典调用delegate()函数的代码如下:
protected virtual T BuildEntityFromReader(IDataReader reader)
{
T entity = this.entityFactory.BuildEntity(reader);
if (this.childCallbacks != null && this.childCallbacks.Count > 0)
{
object childKeyValue = null;
DataTable columnData = reader.GetSchemaTable();
foreach (string childKeyName in this.childCallbacks.Keys)
{
if (DataHelper.ReaderContainsColumnName(columnData, childKeyName))
{
childKeyValue = reader[childKeyName];
}
else
{
childKeyValue = null;
}
this.childCallbacks[childKeyName](entity, childKeyValue);
}
}
return entity;
}
其中函数中的reader是IDataReader,它包含来自DataTable的单个记录/实体/行(函数中的读者类型是reader.read)。
我的问题是,为什么委托单词被用作函数名称来分配给childCallBack字典中的AppendChildData委托对象而不是函数名? (因为它正在编译并运行正常)
而且,在这种情况下.NET如何使用delegate关键字?
答案 0 :(得分:2)
如果我正确理解您的问题,您会对在不同位置使用关键字delegate
感到困惑。
public delegate void AppendChildData(T entityAggregate, object childEntityKeyValue);
以上delegate
的排序答案是
委托是定义方法签名的类型。实例化委托时,可以将其实例与具有兼容签名的任何方法相关联。您可以通过委托实例调用(或调用)该方法。您可以在MSDN
上找到更多信息
在第二种情况下如下
protected override void BuildChildCallbacks()
{
this.childCallbacks.Add("allowances", delegate(Project project, object childKeyName)
{
this.AppendProjectAllowances(project);
});
}
delegate
用于声明anonymous method
。在一句话中,它是没有名字的方法。更多说明在MSDN
最后但并非最不重要的是,将来你应该更加具体地提出你的问题。 :)