ACTUALIZACIÓN: Debería haber mencionado en la publicación original que quiero aprender más sobre los genéricos aquí. Soy consciente de que esto se puede hacer modificando la clase base o creando una interfaz que implementen ambas clases de documentos. Pero por el bien de este ejercicio, solo estoy realmente interesado en las soluciones que no requieren ninguna modificación a las clases de documento o su clase base. Pensé que el hecho de que la pregunta implique métodos de extensión habría implicado esto.¿Cómo refactorizar estos métodos genéricos?
He escrito dos métodos de extensión genéricos casi idénticos y estoy tratando de averiguar cómo podría refactorizarlos en un único método. Se diferencian solo en que uno opera en Lista y el otro en Lista, y las propiedades que me interesan son AssetID para AssetDocument y PersonID para PersonDocument. Aunque AssetDocument y PersonDocument tienen la misma clase base, las propiedades están definidas en cada clase, así que no creo que eso ayude. He tratado
public static string ToCSVList<T>(this T list) where T : List<PersonDocument>, List<AssetDocument>
pensando que entonces podría ser capaz de probar el tipo y actuar en consecuencia, pero esto resulta en el error de sintaxis
parámetro tipo 'T' hereda restricciones conflictivas
Estos son los métodos que me gustaría refactorizar en un único método, pero tal vez simplemente me vaya por la borda y es mejor dejarlos tal como están. Me gustaría saber lo que piensas.
public static string ToCSVList<T>(this T list) where T : List<AssetDocument>
{
var sb = new StringBuilder(list.Count * 36 + list.Count);
string delimiter = String.Empty;
foreach (var document in list)
{
sb.Append(delimiter + document.AssetID.ToString());
delimiter = ",";
}
return sb.ToString();
}
public static string ToCSVList<T>(this T list) where T : List<PersonDocument>
{
var sb = new StringBuilder(list.Count * 36 + list.Count);
string delimiter = String.Empty;
foreach (var document in list)
{
sb.Append(delimiter + document.PersonID.ToString());
delimiter = ",";
}
return sb.ToString();
}
hacer AssetDocument y PersonDocument derivan de una clase base/interfaz común? – Preets