1

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

    //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 delas 如何使用委托关键字?


我正在关注的这本书也使用函数名称而不是使用委托关键字,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;
}

其中函数中的读取器是 IDataReader,它包含来自 DataTable 的单个记录/实体/行(函数中的读取器类型是 reader.read)。

我的问题是为什么委托词被用作函数的名称来分配给 childCallBack 字典中的 AppendChildData 委托对象,而不是函数名称?(因为它正在编译和运行良好)

而且,在这种情况下,.NET delas 如何使用委托关键字?

4

1 回答 1

1

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

最后但并非最不重要的一点是,将来您应该对您的问题更加具体。:)

于 2013-11-15T19:03:35.200 回答