Para abreviar, tengo una función C# que realiza una tarea en un tipo dado que se pasa como una instancia de objeto. Todo funciona bien cuando se pasa una instancia de clase. Sin embargo, cuando el objeto se declara como una interfaz, realmente me gustaría encontrar la clase concreta y realizar la acción sobre ese tipo de clase.Encontrar el tipo concreto detrás de una instancia de interfaz
Aquí es el mal ejemplo ubicua (resplandeciente de propiedad incorrecta carcasa etc):
public interface IA
{
int a { get; set; }
}
public class B : IA
{
public int a { get; set; }
public int b { get; set; }
}
public class C : IA
{
public int a { get; set; }
public int c { get; set; }
}
// snip
IA myBObject = new B();
PerformAction(myBObject);
IA myCObject = new C();
PerformAction(myCObject);
// snip
void PerformAction(object myObject)
{
Type objectType = myObject.GetType(); // Here is where I get typeof(IA)
if (objectType.IsInterface)
{
// I want to determine the actual Concrete Type, i.e. either B or C
// objectType = DetermineConcreteType(objectType);
}
// snip - other actions on objectType
}
Me gustaría que el código en PerformAction utilizar la reflexión contra el que es el parámetro, y ve que no es sólo una instancia de IA pero que es una instancia de B y para ver la propiedad "b" a través de GetProperties(). Si uso .GetType() obtengo el tipo de IA, no lo que quiero.
¿Cómo puede PerformAction determinar el tipo concreto subyacente de la instancia de IA?
Algunos podrían tener la tentación de sugerir el uso de una clase abstracta, pero esa es solo la limitación de mi mal ejemplo. La variable se declarará originalmente como una instancia de interfaz.
Esto suena como un mal diseño. Debe usar el polimorfismo en lugar de que su método conozca los tipos concretos concretos. ¿Qué pasa si agregas uno más tarde? –
¿No derrota eso el propósito de una interfaz? No debe importar cuál es el tipo de hormigón siempre que implemente la interfaz. –
+1 a John y Chris, no solo es un mal diseño, sino que la pregunta no tiene ningún sentido. –