デリゲートにカプセル化される関数の名前として(私の理解によると)デリゲートキーワードを使用する本(デリゲートオブジェクト名/コンストラクターを使用して呼び出されるもの)に従っています。以下はコードです:
//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 しますか?