Ich habe von dem Namen „Generika“ in .NET 2.0 gehört, aber er wurde in der tatsächlichen Entwicklung nicht verwendet.
Ich habe es kürzlich bei der Entwicklung des Blog Park-Website-Programms erlebt.
Anwendungsszenarien:
Lesen Sie die entsprechenden Mail-Einstellungen in der Konfigurationsdatei durch Deserialisierung aus.
Beispiel für eine Konfigurationsdatei:
<BlogConfigurationSettings>
<MailSettings>
<MailSetting Name="ApproveEmail" SmtpServer="smtp.126.com" EmailFrom="" UserName="" PassWord=""></MailSetting>
<MailSetting Name="ContactEmail" SmtpServer="smtp.163.com" EmailFrom="" UserName="" PassWord=""></MailSetting>
</MailSettings>
</BlogConfigurationSettings>
Funktionsbeschreibung:
Über die Konfigurationsdatei wird das Attribut MailSettings der BlogConfigurationSettings-Instanz durch Deserialisierung abgerufen, und dann wird das entsprechende MailSetting gemäß dem Schlüsselwort abgerufen, zum Beispiel: das MailSetting mit dem Namen ApproveEmail.
Definition von MailSetting:
MailSetting
[Serialisierbar]
öffentliche Klasse MailSetting
{
private Zeichenfolge _name;
[XmlAttribute("Name")]
öffentlicher String-Name
{
get { return _name }
set { _name = value;
}
private Zeichenfolge _smtpServer;
[XmlAttribute("SmtpServer")]
öffentliche Zeichenfolge SmtpServer
{
get { return _smtpServer }
set { _smtpServer = value;
}
private Zeichenfolge _mailFrom;
[XmlAttribute("MailFrom")]
öffentliche Zeichenfolge MailFrom
{
get { return _mailFrom }
set { _mailFrom = value }
}
private Zeichenfolge _username;
[XmlAttribute("Benutzername")]
öffentliche Zeichenfolge Benutzername
{
get { return _username }
set { _username = value }
}
private Zeichenfolge _password;
[XmlAttribute("Passwort")]
öffentliche Zeichenfolge Passwort
{
get { return _password }
set { _password = value }
}
öffentlicher String-Schlüssel
{
get { return this.Name }
}
}
Wenn wir keine Generika verwenden, können wir sie über Arrays oder Sammlungsklassen implementieren.
Für Arrays müssen wir dies in BlogConfigurationSettings definieren:
private MailSetting [] __mailSettings;
[XmlArray("MailSettings")]
öffentliches MailSetting [] MailSettings
{
get { return this._mailSettings }
set { this._mailSettings = value }
}Wir müssen außerdem eine Methode schreiben, um die Array-Elemente aufzuzählen und das entsprechende MailSetting basierend auf dem Schlüsselwort zurückzugeben.
Für Sammlungsklassen müssen Sie dies in BlogConfigurationSettings definieren:
private MailSettingCollection _mailSettings;
[XmlArray("MailSettings")]
öffentliche MailSettingColletion MailSettings
{
get { return this._mailSettings }
set { this._mailSettings = value }
}Wir müssen eine MailSettingCollection-Klasse schreiben und eine Methode in MailSettingCollection implementieren, um das entsprechende MailSetting basierend auf Schlüsselwörtern zu finden.
Für Generika müssen wir in BlogConfigurationSettings nur Folgendes definieren:
private List<MailSetting> _mailSettings;
[XmlArray("MailSettings")]
öffentliche Liste<MailSetting> MailSettings
{
get { return _mailSettings }
set { _mailSettings = value;}
}
Dann kann nur die folgende Codezeile das entsprechende MailSetting basierend auf dem Schlüsselwort abrufen:
BlogConfigurationSettings.MailSettings.Find(delegate(MailSetting mailSetting) { return mailSetting.Key == "ApproveEmail"; })
Der Parametertyp der Find-Methode ist Predicate<T> und seine Definition lautet:
öffentlicher Delegat bool Prädikat<T>(T obj)
Das heißt, ein Delegattyp, dessen Parameter generisch sind und dessen Rückgabewert bool ist.
Die Funktion von Find besteht darin, die Elemente in List<T> aufzulisten und den Delegaten mit jedem Element als Parameter des Delegaten aufzurufen. Die eigentliche Delegatenmethode wird über den Find-Parameter übergeben. Wenn der aufgerufene Delegat „true“ zurückgibt, ist das aktuelle Element zurückgegeben.
Sie können den Code im obigen Find-Parameter auch als separate Methode schreiben und dann den Methodennamen als Find-Parameter verwenden.
BlogConfigurationSettings.MailSettings.Find(IsMe);
public bool IsMe(MailSetting mailSetting)
{
return mailSetting.Key == "ApproveEmail";
}
Sie werden sich bei einem solchen Code sofort unwohl fühlen. Warum nicht für jedes Schlüsselwort eine Methode schreiben?
public bool IsMe(MailSetting mailSetting, string key)
{
return mailSetting.Key == key;
}
Natürlich ist es gut, es so zu schreiben, aber Find ist anderer Meinung. Seine Parameter dürfen nur Methoden mit einem Parameter sein.
Wie kann man dieses Problem lösen?
Eine Lösung, die mir einfiel, bestand darin, eine MailSettingPredicate-Klasse zu schreiben:
öffentliche Klasse MailSettingPredicate
{
privater String-Schlüssel;
öffentlicher String-Schlüssel
{
get { Return-Taste }
set {key = value;
}
public bool IsMe(MailSetting mailSetting)
{
return mailSetting.Key == this.key;
}
}
Bevor Sie IsMe aufrufen, legen Sie zunächst den Wert von MailSettingManager.Key fest. Der Code lautet wie folgt:
MailSettingPredicate predicate= new MailSettingPredicate();
predicate.Key = "ApproveEmail";
Config.Settings.MailSettings.Find(predicate.IsMe);
predicate.Key = "ContactEmail";
Config.Settings.MailSettings.Find(predicate.IsMe);
Ich habe gerade .NET 2.0-Generika verwendet, um mein Verständnis zu vertiefen. Ich hoffe auch, Freunden, die mit .NET 2.0-Generika nicht vertraut sind, einige Hinweise zu geben.