Лучший свободный способ получить объекты с общим базовым классом - PullRequest
0 голосов
/ 06 мая 2010

Я изо всех сил пытался придумать хорошее название для этого вопроса, поэтому предложения приветствуются.

Допустим, у нас есть абстрактный базовый класс 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 ...
}

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

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

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 06 мая 2010

То, о чем вы говорите, - это создание метаданных для ваших конкретных классов действий для их описания. Для простого случая Name и Description я рекомендую атрибуты DisplayName и Description, такие как:

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

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

0 голосов
/ 06 мая 2010

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

...