Pour raccourcir une histoire courte, j'ai une fonction C# qui effectue une tâche sur un type donné qui est transmis en tant qu'instance Object. Tout fonctionne correctement lorsqu'une instance de classe est transmise. Cependant, lorsque l'objet est déclaré en tant qu'interface, j'aimerais vraiment trouver la classe concrète et effectuer l'action sur ce type de classe.Recherche du type concret derrière une instance d'interface
Voici le mauvais exemple omniprésent (resplendissante avec boîtier propriété incorrecte, 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
}
Je voudrais le code PerformAction à utiliser la réflexion contre c'est paramètre et voir que ce n'est pas seulement une instance de IA mais que c'est une instance de B et de voir la propriété "b" via GetProperties(). Si j'utilise .GetType(), je reçois le type de IA - pas ce que je veux.
Comment PerformAction peut-il déterminer le type concret sous-jacent de l'instance de IA?
Certains pourraient être tentés de suggérer d'utiliser une classe abstraite mais ce n'est que la limitation de mon mauvais exemple. La variable sera déclarée à l'origine en tant qu'instance d'interface.
Cela ressemble à un mauvais design. Vous devriez utiliser le polymorphisme au lieu de connaître votre méthode sur des types concrets particuliers. Que se passe-t-il si vous en ajoutez un plus tard? –
Cela ne va-t-il pas à l'encontre du but d'une interface? Vous ne devriez pas se soucier de ce que le type concret est tant qu'il implémente l'interface. –
+1 à John et Chris, ce n'est pas seulement mauvais design, mais la question n'a aucun sens. –