Varias clases heredan de la clase abstracta Illness y anulan un name de campo
Enfermedad.cs:
namespace health; abstract class Illness{ public abstract string name { get;} } class Cancer : Illness{ public override string name { get{ return "Cancer";} } } class Covid : Illness{ public override string name { get{ return "Covid";} } } Hay una lista vacía List<Illness> illnesses = new List<Illness> en la clase principal y el objetivo es crear un método que agregue un valor a la lista de illnesses solo si esta lista no contiene la clase dada.
Intenté hacer esto:
public void addIllness(Illness illness){ if (!illnesses.Contains(illness)){ illnesses.Add(illness); } }pero no funciona.
Puede (como lo menciona Lei Yang ) resolver esto marcando el tipo:
if(!illnesses.Any(i=>i is typeof(Covid)){ ... } para un tipo específico.if (!illnesses.Any(i => i.GetType() == illness.GetType())) { ... } comparando el tipo de los objetos.También podría crear un método genérico para lograr esto de una manera agradable:
public void Add<T>(T illness) where T : Illness{ if(!illnesses.Any(t=>t is T)){ illnesses.Add(illness); } } Como está anulando el name , incluso podría usarlo para un mejor rendimiento:
if(!illnesses.Any(i=>i.name == illness.name)){ ... } Sin embargo, esta es más o menos la versión explícita de lo que (nuevamente) @Lei Yang propuso al implementar IEquatable .
Sin embargo, esto parece ser un enfoque un poco extraño, debe usar objetos cuando puede tener más de una instancia de una clase, de lo contrario, tal vez reconsidere agregar una enumeración "Tipo de enfermedad" al lado del Nombre y deshágase de la herencia.
Puede verificar la clase usando el método GetType .
if (!illnesses.Any(i => i.GetType() == illness.GetType())) { illnesses.Add(illness); }