2008-12-03 11 views
3

Ok, j'ai la structure suivante. Fondamentalement, une architecture de pluginComment obtenir le nom de la classe

// assembly 1 - Base Class which contains the contract 
public class BaseEntity { 
    public string MyName() { 
    // figure out the name of the deriving class 
    // perhaps via reflection 
    } 
} 

// assembly 2 - contains plugins based on the Base Class 
public class BlueEntity : BaseEntity {} 
public class YellowEntity : BaseEntity {} 
public class GreenEntity : BaseEntity {} 


// main console app 
List<BaseEntity> plugins = Factory.GetMePluginList(); 

foreach (BaseEntity be in plugins) { 
    Console.WriteLine(be.MyName); 
} 

Je voudrais la déclaration

be.MyName 

pour me dire si l'objet est BlueEntity, YellowEntity ou GreenEntity. L'important est que la propriété MyName soit dans la classe de base, car je ne veux pas réimplémenter la propriété dans chaque plugin.

Est-ce possible en C#?

Répondre

10

suivant, je pense que vous pouvez le faire à travers GetType:

public class BaseEntity { 
    public string MyName() { 
     return this.GetType().Name 
    } 
} 
-2

Essayez ce modèle

class BaseEntity { 
    private readonly m_name as string; 
    public Name { get { return m_name; } } 
    protected BaseEntity(name as string) { 
    m_name = name; 
    } 
} 
class BlueEntity : BaseEntity { 
    public BlueEntity() : base(typeof(BlueEntity).Name) {} 
} 
+0

Ce n'est pas exactement ce que le questionneur était recherche (voir la question les commentaires qu'il a ajoutés à la méthode MyName) – hhafez

+0

Le résultat final et la méthode sont les mêmes. – JaredPar

+0

Le résultat final est le même, vrai, mais il va confondre l'enfer d'une personne qui va maintenir le code après moi. Je vais rester avec le .GetType dans le getter de propriété. – AngryHacker

1

Modifier votre foreach au

foreach (BaseEntity be in plugins) { 
    Console.WriteLine(be.GetType().Name); 
} 
2

C# mis en place une façon de regarder à des objets appelés Reflection. Cela peut renvoyer des informations sur l'objet que vous utilisez.

La fonction GetType() renvoie le nom de la classe sur laquelle vous l'appelez. Vous pouvez l'utiliser comme ceci:

return MyObject.GetType().Name; 

La réflexion peut faire beaucoup de choses. S'il y a plus que vous voulez savoir sur la réflexion que vous pouvez lire à ce sujet sur ces sites:

5
public class BaseEntity { 
    public string MyName() { 
    return this.GetType().Name; 
    } 
} 

"cette" pointera vers la classe dérivée, donc si vous deviez faire:

BaseEntity.MyName 
"BaseEntity" 

BlueEntitiy.MyName 
"BlueEntity" 

EDIT: Doh, Gorky m'a battu à ça.

-1

Si vous n'êtes pas substituée la méthode ToString() de la classe, alors vous pouvez simplement écrire ce qui suit

string s = ToString().Split(',')[0]; // to get fully qualified class name... or, 
s = s.Substring(s.LastIndexOf(".")+1); // to get just the actual class name itself 

en utilisant le code an:

// assembly 1 - Base Class which contains the contractpublic class BaseEntity 
    { 
     public virtual string MyName // I changed to a property 
     {  
      get { return MyFullyQualifiedName.Substring(
       MyFullyQualifiedName.LastIndexOf(".")+1); } 
     } 
     public virtual string MyFullyQualifiedName // I changed to a property 
     {  
      get { return ToString().Split(',')[0]; } 
     } 
} 
// assembly 2 - contains plugins based on the Base Class 
public class BlueEntity : BaseEntity {} 
public class YellowEntity : BaseEntity {} 
public class GreenEntity : BaseEntity {} 
// main console app 
    List<BaseEntity> plugins = Factory.GetMePluginList(); 
    foreach (BaseEntity be in plugins) 
    { Console.WriteLine(be.MyName);} 
Questions connexes