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() という名前の関数です。なぜ?この場合、delegate キーワードを使用して .NET はどのように delas しますか?


私がフォローしている本でも、delegate キーワードを使用する代わりに関数名を使用しています。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 の列ではない) ではない場合にデリゲート キーワードが使用され、これらのデリゲートを呼び出すと、delegate() 関数の 2 番目の引数、つまり「childKeyName」に NULL が渡されることがわかりました。辞書を使用して 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;
}

関数内のリーダーは、DataTable からの単一のレコード/エンティティ/行を含む IDataReader です (関数内のリーダーの種類は reader.read です)。

私の質問は、関数名の代わりに、childCallBack 辞書の AppendChildData デリゲート オブジェクトに割り当てる関数の名前としてデリゲート ワードが使用されているのはなぜですか? (コンパイルして正常に動作しているため)

そして、この場合、デリゲート キーワードを使用して .NET はどのように delas しますか?

4

1 に答える 1