es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Puedo llamar a un método estático que reside en una clase base con una referencia a la clase que implementa esa clase base (en C#)?

Tengo dificultades para formular la pregunta, lo que también me está haciendo difícil buscar respuestas.

Aquí hay un escenario inventado que imita lo que me gustaría hacer:

“`c#
void Main()
{
Console.WriteLine(TestClassA.NombreDeMiPropiedad());
Console.WriteLine(TestClassB.NombreDeMiPropiedad());

var altavoz = new TestSpeaker();
altavoz.Hablar<TestClassA>();
altavoz.Hablar<TestClassB>();
}

public class TestSpeaker {
public void Hablar<T>() where T : BaseClass<T> {
Console.WriteLine(/* Quiero llamar a T.NombreDeMiPropiedad () aquí */);
}
}

public class TestClassA : BaseClass<TestClassA> {
public string Nombre { get; set; }
}

public class TestClassB : BaseClass<TestClassB> {
public string OtroNombreDePropiedad { get; set; }
}

public abstract class BaseClass<T> {
public static string NombreDeMiPropiedad(){
return typeof(T).GetProperties().Single().Name;
}
}
“`

La Consola actualmente mostraría:

Nombre

OtroNombreDePropiedad

Me gustaría reemplazar mi código comentado para que lea:

Nombre

OtroNombreDePropiedad

Nombre

OtroNombreDePropiedad

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La pregunta específica que se está haciendo parece ser cómo llamar al método MyPropertyName() para el tipo genérico T dentro del método Speak<t> en el código C# dado.

    Una posible solución al problema es añadir una restricción a la clase BaseClass<t> para que implemente una interfaz con la propiedad deseada (Name o OtherPropertyName). Entonces, se debe hacer un casting del objeto T que se pasa al método Speak<t> al tipo de la interfaz y llamar la propiedad. Por ejemplo:

    “`c#
    public interface IHasPropertyName {
    string PropertyName { get; }
    }

    public class TestSpeaker {
    public void Speak() where T : BaseClass, IHasPropertyName {
    Console.WriteLine(((IHasPropertyName)new T()).PropertyName);
    }
    }

    public class TestClassA : BaseClass, IHasPropertyName {
    public string Name { get; set; }

    public string PropertyName { get { return Name; } }
    

    }

    public class TestClassB : BaseClass, IHasPropertyName {
    public string OtherPropertyName { get; set; }

    public string PropertyName { get { return OtherPropertyName; } }
    

    }

    public abstract class BaseClass where T : BaseClass {

    public static string MyPropertyName(){
        return typeof(T).GetProperties().Single().Name;
    }
    

    }
    “`

    Este código modificado añade la interfaz IHasPropertyName, que es implementada por TestClassA y TestClassB con sus respectivas propiedades. El método Speak<t> ahora está restringido para aceptar solo tipos que implementen esta interfaz.

    Dentro del método Speak<t>, el objeto T es cast a un tipo de interfaz IHasPropertyName, lo que permite acceder directamente a la propiedad PropertyName sin tener que depender de la reflexión. El método estático MyPropertyName() en BaseClass<t> ya no necesita ser llamado.

Comments are closed.