C#.NET委托关键字作为要使用委托对象/构造函数调用的函数的名称

时间:2013-10-03 13:35:31

标签: c# dictionary delegates keyword

我正在阅读一本书,该书使用委托关键字(根据我的理解)作为要封装在委托中的函数的名称(使用委托对象名称/构造函数调用的那个)。下面是代码:

    //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关键字?

1 个答案:

答案 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

最后但并非最不重要的是,将来你应该更加具体地提出你的问题。 :)