.NET 2.0 のジェネリックの名前については聞いたことがありますが、実際の開発では使用されていません。
私は最近、ブログパーク Web サイトプログラムの開発中にそれを経験しました。
アプリケーションシナリオ:
逆シリアル化を通じて、構成ファイル内の対応するメール設定を読み取ります。
設定ファイルの例:
<ブログ構成設定>
<メール設定>
<MailSetting Name="ApproveEmail" SmtpServer="smtp.126.com" EmailFrom="" UserName="" PassWord=""></MailSetting>
<MailSetting Name="ContactEmail" SmtpServer="smtp.163.com" EmailFrom="" UserName="" PassWord=""></MailSetting>
</メール設定>
</ブログ構成設定>
機能の説明:
構成ファイルを通じて、BlogConfigurationSettings インスタンスの属性 MailSettings が逆シリアル化によって取得され、対応する MailSetting がキーワードに従って取得されます (例: ApproveEmail という名前の MailSetting)。
MailSetting の定義:
メール設定
【シリアライズ可能】
パブリック クラス MailSettings
{
プライベート文字列_name;
[XmlAttribute("名前")]
パブリック文字列名
{
{ _name を返す } を取得します。
セット { _name = 値 }
プライベート
文字列_smtpServer;
[XmlAttribute("SmtpServer")]
パブリック文字列SmtpServer
{
get { return _smtpServer }
セット { _smtpServer = 値 }
プライベート
文字列_mailFrom;
[XmlAttribute("MailFrom")]
パブリック文字列 MailFrom
{
get { return _mailFrom }
セット { _mailFrom = 値 }
プライベート文字列_username
;
[XmlAttribute("ユーザー名")]
パブリック文字列ユーザー名
{
get { _username を返す }
セット { _ユーザー名 = 値 }
プライベート
文字列_password;
[XmlAttribute("パスワード")]
パブリック文字列パスワード
{
取得 { パスワードを返す }
セット { _パスワード = 値 }
公開文字列
キー
{
get { この名前を返す }
}
}
ジェネリックスを使用しない場合は、配列またはコレクション クラスを通じて実装できます。
配列の場合、BlogConfigurationSettings でこれを定義する必要があります。
private MailSetting [] __mailSettings;
[XmlArray("メール設定")]
public MailSetting [] MailSettings
{
get { return this._mailSettings }
set { this._mailSettings = 値 }
また、配列要素を列挙し、キーワードに基づいて対応する MailSetting を返すメソッドを記述する必要があります。
コレクション クラスの場合、BlogConfigurationSettings でこれを定義する必要があります。
プライベート MailSettingCollection _mailSettings;
[XmlArray("メール設定")]
public MailSettingCollection MailSettings
{
get { return this._mailSettings }
set { this._mailSettings = 値 }
MailSettingCollection クラスを作成し、キーワードに基づいて対応する MailSetting を見つけるメソッドを MailSettingCollection に実装する必要があります。
ジェネリックの場合、BlogConfigurationSettings で以下を定義するだけで済みます。
private List<MailSetting> _mailSettings;
[XmlArray("メール設定")]
public List<MailSetting> MailSettings
{
get { return _mailSettings }
set { _mailSettings = 値;}
}
次に、次のコード行だけで、キーワードに基づいて対応する MailSetting を取得できます。
BlogConfigurationSettings.MailSettings.Find(delegate(MailSetting mailSetting) { return mailSetting.Key == "ApproveEmail"; })
Find メソッドのパラメーターの型は Predicate<T> で、その定義は次のとおりです。
パブリック デリゲート bool Predicate<T>(T obj)
つまり、パラメーターがジェネリックで戻り値が bool であるデリゲート型です。
Find の機能は、List<T> 内の要素を列挙し、各要素をデリゲートのパラメーターとして指定してデリゲートを呼び出すことです。呼び出されたデリゲートが true を返すと、現在の要素は次のようになります。戻ってきました。
上記の Find パラメーターにコードを別のメソッドとして記述し、そのメソッド名を Find のパラメーターとして使用することもできます。
BlogConfigurationSettings.MailSettings.Find(IsMe);
public bool IsMe(MailSetting mailSetting)
{
return mailSetting.Key == "ApproveEmail";
}
このようなコードはすぐに不快に感じるでしょう。次のように各キーワードにメソッドを記述してみてはいかがでしょうか。
public bool IsMe(MailSetting mailSetting, 文字列キー)
{
return mailSetting.Key == キー;
}
もちろん、この方法で記述するのは良いことですが、Find のパラメータは 1 つのパラメータを持つメソッドのみとして許可されます。
では、この問題をどうやって解決すればいいのでしょうか?
私が考えた解決策は、MailSettingPredicate クラスを書くことでした。
パブリック クラス MailSettingPredicate
{
秘密文字列キー;
公開文字列キー
{
{リターンキー}を取得します。
セット { キー = 値 }
public bool IsMe(MailSetting mailSetting
)
{
return mailSetting.Key == this.key;
}
}
IsMe を呼び出す前に、まず MailSettingManager.Key の値を設定します。コードは次のとおりです。
MailSettingPredicate 述語 = new MailSettingPredicate();
predicate.Key = "ApproveEmail";
Config.Settings.MailSettings.Find(predicate.IsMe);
predicate.Key = "連絡先メールアドレス";
Config.Settings.MailSettings.Find(predicate.IsMe);
私は実際の開発で .NET 2.0 ジェネリックを使用したばかりなので、理解を深めたいと思っています。また、.NET 2.0 ジェネリックに慣れていない人にも参考にしていただけると幸いです。