He oído hablar del nombre de los genéricos en .NET 2.0, pero no se ha utilizado en el desarrollo real.
Lo experimenté recientemente durante el desarrollo del programa del sitio web Blog Park.
Escenarios de aplicación:
Lea la configuración de correo correspondiente en el archivo de configuración mediante deserialización.
Ejemplo de archivo de configuración:
<Configuración del blog>
<Configuración de correo>
<MailSetting Name="ApproveEmail" SmtpServer="smtp.126.com" EmailFrom="" UserName="" PassWord=""></MailSetting>
<MailSetting Name="ContactEmail" SmtpServer="smtp.163.com" EmailFrom="" UserName="" PassWord=""></MailSetting>
</Configuración de correo>
</BlogConfigurationSettings>
Descripción de la función:
A través del archivo de configuración se obtiene mediante deserialización el atributo MailSettings de la instancia BlogConfigurationSettings, y luego se obtiene el MailSetting correspondiente según la palabra clave, por ejemplo: el MailSetting llamado ApproveEmail.
Definición de configuración de correo:
Configuración de correo
[Serializable]
Configuración de correo de clase pública
{
cadena privada _nombre;
[AtributoXml("Nombre")]
Nombre de cadena pública
{
obtener {return_name}
establecer { _nombre = valor }
}
cadena privada _smtpServer;
[AtributoXml("ServidorSmtp")]
cadena pública SmtpServer
{
obtener { return _smtpServer }
establecer { _smtpServer = valor }
}
cadena privada _mailFrom;
[XmlAttribute("CorreoDe")]
cadena pública MailFrom
{
obtener { return _mailFrom }
establecer { _mailFrom = valor }
}
cadena privada _nombre de usuario;
[XmlAttribute("Nombre de usuario")]
nombre de usuario de cadena pública
{
obtener {return_username}
establecer { _nombre de usuario = valor }
}
cadena privada _contraseña;
[AtributoXml("Contraseña")]
contraseña de cadena pública
{
obtener {return_password}
establecer { _contraseña = valor }
}
clave de cadena pública
{
obtener {devolver esto.Nombre}
}
}
Si no usamos genéricos, podemos implementarlo mediante matrices o clases de colección.
Para matrices, debemos definir esto en BlogConfigurationSettings:
Configuración de correo privada [] __mailSettings;
[XmlArray("Configuración de correo")]
Configuración de correo pública [] Configuración de correo
{
obtener {return this._mailSettings};
establecer { this._mailSettings = valor }
}También necesitamos escribir un método para enumerar los elementos de la matriz y devolver el MailSetting correspondiente según la palabra clave.
Para las clases de colección, debes definir esto en BlogConfigurationSettings:
colección de configuración de correo privada _mailSettings;
[XmlArray("Configuración de correo")]
Colección pública de configuración de correoConfiguración de correo
{
obtener {return this._mailSettings};
establecer { this._mailSettings = valor }
} Necesitamos escribir una clase MailSettingCollection e implementar un método en MailSettingCollection para encontrar el MailSetting correspondiente según las palabras clave.
Para los genéricos, solo necesitamos definir lo siguiente en BlogConfigurationSettings:
Lista privada<Configuración de correo> _mailSettings;
[XmlArray("Configuración de correo")]
Lista pública<Configuración de correo>Configuración de correo
{
obtener { return _mailSettings }
establecer { _mailSettings = valor;}
}
Luego, solo la siguiente línea de código puede obtener el MailSetting correspondiente según la palabra clave:
BlogConfigurationSettings.MailSettings.Find(delegate(MailSetting mailSetting) { return mailSetting.Key == "ApproveEmail"; })
El tipo de parámetro del método Find es Predicado<T> y su definición es:
predicado bool delegado público<T>(T obj)
Es decir, un tipo de delegado cuyos parámetros son genéricos y cuyo valor de retorno es bool.
La función de Find es enumerar los elementos en List<T> y llamar al delegado con cada elemento como parámetro del delegado. El método delegado real se pasa a través del parámetro Find. Cuando el delegado llamado devuelve verdadero, el elemento actual es. regresó.
También puede escribir el código en el parámetro Buscar anterior como un método separado y luego usar el nombre del método como parámetro de Buscar.
BlogConfigurationSettings.MailSettings.Find(IsMe);
bool público IsMe (Configuración de correo configuración de correo)
{
return mailSetting.Key == "AprobarEmail";
}
Inmediatamente se sentirá incómodo con dicho código. ¿Por qué no escribir un método para cada palabra clave? Cree que debería escribirse así:
bool público IsMe (Configuración de correo configuración de correo, clave de cadena)
{
devolver mailSetting.Key == clave;
}
Por supuesto, es bueno escribirlo de esta manera, pero Find no está de acuerdo. Sus parámetros solo pueden ser métodos con un parámetro.
Entonces, ¿cómo solucionar este problema?
Una solución que se me ocurrió fue escribir una clase MailSettingPredicate:
clase pública MailSettingPredicate
{
clave de cadena privada;
clave de cadena pública
{
obtener {tecla de retorno}
establecer { clave = valor }
}
public bool IsMe(Configuración de correo configuración de correo)
{
return mailSetting.Key == this.key;
}
}
Antes de llamar a IsMe, primero establezca el valor de MailSettingManager.Key El código es el siguiente:
Predicado MailSettingPredicate = nuevo MailSettingPredicate();
predicado.Key = "AprobarCorreo electrónico";
Config.Settings.MailSettings.Find(predicado.IsMe);
predicado.Key = "Correo electrónico de contacto";
Config.Settings.MailSettings.Find(predicado.IsMe);
Acabo de usar los genéricos de .NET 2.0 en el desarrollo real. Escribo este artículo para profundizar mi comprensión. También espero proporcionar algunas referencias para los amigos que no están familiarizados con los genéricos de .NET 2.0. Puede señalar cualquier deficiencia.