2010-05-05 2 views
0

Я изо всех сил старался придумать хороший заголовок для этого вопроса, поэтому предложения приветствуются.Лучший свободный способ получить объекты с общим базовым классом

Скажем, у нас есть абстрактный базовый класс ActionBase, который выглядит примерно так:

public abstract class ActionBase 
{ 
    public abstract string Name { get; } 
    public abstract string Description { get; } 

    // rest of declaration follows 
} 

И у нас есть куча различных действий, определенная, как MoveFileAction, WriteToRegistryAction и т.д. Эти действия привязываются к Worker объекты:

public class Worker 
{ 
    private IList<ActionBase> _actions = new List<ActionBase>(); 
    public IList<ActionBase> Actions { get { return _actions; } } 

    // worker stuff ... 
} 

До сих пор довольно прямолинейно. Теперь я хотел бы иметь пользовательский интерфейс для настройки Workers, назначения Actions, установки свойств и т. Д. В этом пользовательском интерфейсе я хочу представить список всех доступных действий вместе со своими свойствами, и для этого я хотел бы сначала собрать все имена и описания доступных действий (плюс тип) в коллекцию следующих Тип товара:

public class ActionDescriptor 
{ 
    public string Name { get; } 
    public string Description { get; } 
    poblic Type Type { get; } 
} 

Конечно, я могу использовать отражение, чтобы сделать это, но есть ли лучший способ? Наличие имени и описания свойств экземпляра ActionBase (в отличие от статики на производных классах) немного пахнет, но в C# нет абстрактного статичного.

Спасибо!

+0

Не существует «статической абстрактности», потому что нет понятия статического наследования. –

+0

Я не спорю о «статической абстракции», просто отмечая, что ключевое слово «abstract» помогает заключить контракт. –

+0

Возможно, я должен уточнить. Я не спорю о «статической абстрактности», и я понимаю, почему у нас нет этого в C#. Я имел в виду, что свойства Name и Description на самом деле не имеют особого смысла в экземпляре объекта, но я хочу, чтобы каждая реализация имела имя и описание, и нет способа обеспечить выполнение этого контракта с помощью свойство 'static'. –

ответ

2

Речь идет о создании метаданных для конкретных классов Action для их описания. Для простого случая Имя и описание, я рекомендую DisplayName и описание атрибутов, как это:

[DisplayName("MyAction Name")] 
[Description("My description goes here")] 
public class MyAction : ActionBase 
{ 
    //Declaration goes here 
} 

Эти атрибуты определены в System.ComponentModel.

+0

Спасибо Dan. С помощью этого подхода вы все еще будете использовать рефлексию для сбора списка? –

+0

Да, вы хотели бы найти производные ActionBase, а затем использовать атрибут Attribute.GetCustomAttribute для извлечения атрибутов. –

+0

Какие альтернативы существуют для отражения для этого сценария? –

0

Вы можете добавить абстрактный метод в ActionBase, который возвращает ActionDescriptor, а затем вы можете запросить каждое действие для своего дескриптора.

+0

Дэн, мне все равно нужно было бы получить список действий. –

+0

Справа. Я работаю над проектом, который использует что-то вроде ActionManager, с которым каждое действие регистрируется при создании. Затем mgr может быть запрошен для списка действий. – DanJ

+0

Я реализовал этот шаблон раньше.Бит, который мне не нравится в этом, заключается в том, что все действия должны быть искусственно созданы для того, чтобы они сами регистрировались. –

Смежные вопросы