2016-12-19 4 views
2

J'ai une classe imbriquée dans une classe externe et à partir de la classe interne je voudrais obtenir le nom de la classe externe via la réflexion à l'exécution.Obtenir le nom de la classe environnante à partir de la classe imbriquée

public abstract class OuterClass // will be extended by children 
{ 
    protected class InnerClass // will also be extended 
    { 
     public virtual void InnerMethod() 
     { 
      string nameOfOuterClassChildType = ?; 
     } 
    } 
} 

Est-ce possible en C#? Editer: Je devrais ajouter que je veux utiliser la réflexion et obtenir le nom d'une classe enfant qui s'étend de OuterClass, ce qui est la raison, je ne connais pas le type concret à la compilation.

+0

Que diriez-vous juste '= nameof (OuterClass);'? –

+0

J'ai ajouté d'autres informations à mon message. Dans mon cas particulier, je ne connais pas le type concret de OuterClass, et les classes enfants appellent base.InnerMethod() pour récupérer des données de base. Il serait pratique d'utiliser la réflexion au lieu de fournir des méthodes virtuelles supplémentaires pour obtenir le nom de la classe enfant encapsulante. – Xarbrough

+1

Vous devez être spécifique. Essayez ceci: 'GetType(). DeclaringType.Name;' –

Répondre

1

Quelque chose comme cela devrait analyser le nom de la classe externe:

public virtual void InnerMethod() 
{ 
    Type type = this.GetType(); 

    // type.FullName = "YourNameSpace.OuterClass+InnerClass" 

    string fullName = type.FullName; 
    int dotPos = fullName.LastIndexOf('.'); 
    int plusPos = fullName.IndexOf('+', dotPos); 
    string outerName = fullName.Substring(dotPos + 1, plusPos - dotPos - 1); 

    // outerName == "OuterClass", which I think is what you want 
} 

Ou, comme @LasseVKarlsen proposé,

string outerName = GetType().DeclaringType.Name; 

... qui est en fait une meilleure réponse.

+0

J'aime Lasses répondre le mieux. Fonctionne bien et est court. Mais l'analyse de l'assemblage semble également fonctionner. Mabye qui peut être un dernier recours pour certaines circonstances spéciales de magie noire. Merci à vous deux! – Xarbrough