2008-12-03 3 views
3

Хорошо, у меня есть следующая структура. В основном это плагин архитектурыКак получить название класса

// 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); 
} 

Я хотел бы заявление

be.MyName 

мне сказать, является ли объект BlueEntity, YellowEntity или GreenEntity. Важно то, что свойство MyName должно быть в базовом классе, потому что я не хочу переопределять свойство в каждом плагине.

Возможно ли это в C#?

ответ

10

Я думаю, что вы можете сделать это через GetType:

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

Попробуйте эту модель

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

Это не совсем то, что спрашивающий был (см. вопрос о комментариях, которые он добавил к методу MyName) – hhafez 2008-12-03 23:00:20

1

Изменить ваше заявление Еогеасп к следующему

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

C# реализован способ посмотреть на объектах, называемых Reflection. Это может вернуть информацию об объекте, который вы используете.

Функция GetType() возвращает имя класса, к которому вы его вызываете. Вы можете использовать его следующим образом:

return MyObject.GetType().Name; 

Отражение может многое сделать. Если есть еще, что вы хотите знать о рефлексии вы можете прочитать об этом на этих сайтах:

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

"это" будет указывать на производный класс, поэтому, если вы должны были сделать:

BaseEntity.MyName 
"BaseEntity" 

BlueEntitiy.MyName 
"BlueEntity" 

EDIT: Дох, Горький избил меня.

-1

Если вы не переопределяется метод ToString() для класса, то вы можете просто написать следующее

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 

используя код YR:

// 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);} 
Смежные вопросы