AGGIORNAMENTO: avrei dovuto menzionare nel post originale che voglio saperne di più sui generici qui. Sono consapevole che ciò può essere fatto modificando la classe base o creando un'interfaccia che entrambe le classi di documenti implementano. Ma per il piacere di questo esercizio sono interessato solo a soluzioni che non richiedono alcuna modifica alle classi di documenti o alla loro classe base. Pensavo che il fatto che la domanda riguardasse i metodi di estensione avrebbe implicato questo.Come refactoring questi metodi generici?
Ho scritto due metodi di estensione generici quasi identici e sto cercando di capire come potrei rifattenerli in un unico metodo. Differiscono solo in quello che opera su List e l'altro su List e le proprietà a cui sono interessato sono AssetID per AssetDocument e PersonID per PersonDocument. Sebbene AssetDocument e PersonDocument abbiano la stessa classe base, le proprietà sono definite in ogni classe, quindi non credo che questo aiuti. Ho provato
public static string ToCSVList<T>(this T list) where T : List<PersonDocument>, List<AssetDocument>
pensare che potrei quindi in grado di verificare il tipo e agire di conseguenza, ma questo genera l'errore di sintassi
parametro Type 'T' eredita contrastanti vincoli
Questi sono i metodi che mi piacerebbe refactoring in un unico metodo, ma forse sto semplicemente esagerando e sarebbe meglio lasciarli così come sono. Mi piacerebbe sentire cosa ne pensi.
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();
}
fare AssetDocument e PersonDocument derivano da una classe/interfaccia di base comune? – Preets