获取具有公共基类的对象的最佳松散方式

时间:2010-05-05 21:01:53

标签: c# reflection inversion-of-control

我努力为这个问题提出一个好头衔,所以欢迎提出建议。

假设我们有一个抽象的基类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 ...
}

到目前为止,非常直截了当。现在,我想要一个用于设置Worker,分配动作,设置属性等的UI。在这个UI中,我想要提供所有可用操作的列表及其属性,为此,我想首先将可用操作的所有名称和描述(以及类型)收集到以下集合中项目类型:

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

当然,我可以用反射来做到这一点,但是有更好的方法吗?让Name和Description成为ActionBase的实例属性(与派生类上的静态相反)有点惹人注意,但C#中没有抽象静态。

谢谢!

2 个答案:

答案 0 :(得分:2)

您所说的是为具体的Action类创建元数据来描述它们。对于名称和描述的简单情况,我推荐DisplayName和Description属性,如下所示:

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

这些属性在System.ComponentModel中定义。

答案 1 :(得分:0)

您可以向ActionBase添加一个抽象方法,该方法返回一个ActionDescriptor,然后您可以查询每个操作的描述符。