Je voudrais être en mesure de faire ce qui suit pour plusieurs classes:types génériques et l'héritage
var obj1 = new MyClass { Id = 1 };
var obj2 = new MyClass { Id = 2 };
obj1.Compare(obj2);
J'ai fait la méthode d'extension suivante (inspired by a different question inhere):
public static class ObjExt
{
public static ICollection<string> Compare<T>(this T obj1, T obj2)
{
var properties = typeof(T).GetProperties();
var changes = new List<string>();
foreach (var pi in properties)
{
var value1 = typeof(T).GetProperty(pi.Name).GetValue(obj1, null);
var value2 = typeof(T).GetProperty(pi.Name).GetValue(obj2, null);
if (value1 != value2 && (value1 == null || !value1.Equals(value2)))
{
changes.Add(string.Format("Value of {0} changed from <{1}> to <{2}>.", pi.Name, value1, value2));
}
}
return changes;
}
Maintenant, cela fonctionne si Je fais une méthode dans toutes les classes que je veux comparer, donc je me suis dit que je le déplacerais donc une super classe pour DRY.
public class MyClass
{
public int Id { get; set; }
public ICollection<string> CompareMe<T>(T obj2)
{
return Compare<T>(obj2);
}
}
Si je déménage à une super classe, je reçois cette erreur de compilation:
Cannot convert instance type argument 'SuperClass' to 'T'
Si je le fais dans ma classe super:
return this.Compare<T>(obj2);
je reçois une erreur de compilation en disant:
The type arguments for method 'Compare(T, T)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
Comment faire ceci gener ic dans une super classe?
Peut-être que je ne comprends pas, mais si vous voulez déplacer votre méthode dans votre super classe pourquoi avez-vous besoin d'une méthode d'extension? –
Bonne question! Et une solution encore meilleure. Je n'ai pas pensé à cela en refactoring. Je vous remercie! –
Puis-je mettre un commentaire à jour pour le corriger? –