J'ai entendu parler du nom des génériques dans .NET 2.0, mais il n'a pas été utilisé dans le développement réel.
J’en ai récemment fait l’expérience lors du développement du programme du site Blog Park.
Scénarios d'application :
Lisez les paramètres de messagerie correspondants dans le fichier de configuration via la désérialisation.
Exemple de fichier de configuration :
<Paramètres de configuration du blog>
<Paramètres de messagerie>
<MailSetting Name="ApproveEmail" SmtpServer="smtp.126.com" EmailFrom="" UserName="" PassWord=""></MailSetting>
<MailSetting Name="ContactEmail" SmtpServer="smtp.163.com" EmailFrom="" UserName="" PassWord=""></MailSetting>
</Paramètres de courrier>
</BlogConfigurationSettings>
Description de la fonction :
Grâce au fichier de configuration, l'attribut MailSettings de l'instance BlogConfigurationSettings est obtenu par désérialisation, puis le MailSetting correspondant est obtenu en fonction du mot-clé, par exemple : le MailSetting nommé ApproveEmail.
Définition de MailSetting :
Paramètres de messagerie
[Sérialisable]
classe publique MailSetting
{
chaîne privée _name ;
[XmlAttribute("Nom")]
chaîne publique Nom
{
obtenir { return _name }
définir { _nom = valeur }
}
chaîne privée _smtpServer ;
[XmlAttribute("Serveur Smtp")]
chaîne publique SmtpServer
{
obtenir { retourner _smtpServer }
définir { _smtpServer = valeur }
}
chaîne privée _mailFrom ;
[XmlAttribute("MailFrom")]
chaîne publique MailFrom
{
obtenir { return _mailFrom }
définir { _mailFrom = valeur }
}
chaîne privée _username ;
[XmlAttribute("Nom d'utilisateur")]
chaîne publique Nom d'utilisateur
{
obtenir { return _nom d'utilisateur }
définir { _nom d'utilisateur = valeur }
}
chaîne privée _password ;
[XmlAttribute("Mot de passe")]
chaîne publique Mot de passe
{
obtenir { return _password }
définir { _mot de passe = valeur }
}
chaîne publique Clé
{
get { return this.Name }
}
}
Si nous n'utilisons pas de génériques, nous pouvons l'implémenter via des tableaux ou des classes de collection.
Pour les tableaux, nous devons définir ceci dans BlogConfigurationSettings :
privé MailSetting [] __mailSettings ;
[XmlArray("Paramètres de messagerie")]
public MailSetting [] MailSettings
{
obtenir { return this._mailSettings }
set { this._mailSettings = valeur }
}Nous devons également écrire une méthode pour énumérer les éléments du tableau et renvoyer le MailSetting correspondant en fonction du mot-clé.
Pour les classes de collection, vous devez définir cela dans BlogConfigurationSettings :
privé MailSettingCollection _mailSettings ;
[XmlArray("Paramètres de messagerie")]
public MailSettingColletion MailSettings
{
obtenir { return this._mailSettings }
set { this._mailSettings = valeur }
}Nous devons écrire une classe MailSettingCollection et implémenter une méthode dans MailSettingCollection pour trouver le MailSetting correspondant en fonction de mots-clés.
Pour les génériques, il suffit de définir les éléments suivants dans BlogConfigurationSettings :
liste privée<MailSetting> _mailSettings ;
[XmlArray("Paramètres de messagerie")]
liste publique<MailSetting> MailSettings
{
obtenir { return _mailSettings }
définir { _mailSettings = valeur ;}
}
Ensuite, seule la ligne de code suivante peut obtenir le MailSetting correspondant en fonction du mot-clé :
BlogConfigurationSettings.MailSettings.Find(delegate(MailSetting mailSetting) { return mailSetting.Key == "ApproveEmail"; })
Le type de paramètre de la méthode Find est Predicate<T> et sa définition est :
public délégué bool Predicate<T>(T obj)
C'est-à-dire un type délégué dont les paramètres sont génériques et dont la valeur de retour est bool.
La fonction de Find est d'énumérer les éléments dans List<T> et d'appeler le délégué avec chaque élément comme paramètre du délégué. La méthode déléguée réelle est transmise via le paramètre Find. Lorsque le délégué appelé renvoie true, l'élément actuel est. est revenu.
Vous pouvez également écrire le code dans le paramètre Find ci-dessus en tant que méthode distincte, puis utiliser le nom de la méthode comme paramètre de Find.
BlogConfigurationSettings.MailSettings.Find(IsMe);
public bool IsMe (MailSetting mailSetting)
{
return mailSetting.Key == "ApproveEmail";
}
Vous vous sentirez immédiatement mal à l'aise avec un tel code. Pourquoi ne pas écrire une méthode pour chaque mot-clé. Vous pensez qu'elle devrait être écrite comme ceci :
public bool IsMe (MailSetting mailSetting, clé de chaîne)
{
return mailSetting.Key == clé ;
}
Bien sûr, c'est bien de l'écrire de cette façon, mais Find n'est pas d'accord. Ses paramètres ne peuvent être que des méthodes avec un seul paramètre.
Alors comment résoudre ce problème ?
Une solution à laquelle j'ai pensé était d'écrire une classe MailSettingPredicate :
classe publique MailSettingPredicate
{
clé de chaîne privée ;
clé de chaîne publique
{
obtenir { clé de retour }
définir { clé = valeur }
}
public bool IsMe(MailSetting mailSetting)
{
return mailSetting.Key == this.key;
}
}
Avant d'appeler IsMe, définissez d'abord la valeur de MailSettingManager.Key. Le code est le suivant :
MailSettingPredicate predicate= new MailSettingPredicate();
predicate.Key = "ApprouverEmail";
Config.Settings.MailSettings.Find(predicate.IsMe);
predicate.Key = "ContactEmail";
Config.Settings.MailSettings.Find(predicate.IsMe);
Je viens d'utiliser les génériques .NET 2.0 dans le développement réel. J'écris cet article pour approfondir ma compréhension. J'espère également fournir des références aux amis qui ne sont pas familiers avec les génériques .NET 2.0. Vous êtes invités à signaler toute lacune.