确保目标继承自定义属性的某个接口

时间:2012-01-08 21:48:21

标签: c# reflection attributes custom-attributes

我需要创建一些自定义属性,用于我的反射函数。

这是用例,我认为:

  • 用户创建了一些类并使用我的特殊属性标记它(例如 [ImportantAttribute]
  • 然后用户使用我的库中的函数执行某些操作。这些函数使用 [ImportantAttribute] 查找类并使用它们执行某些操作

主要问题是我的库中的函数需要,标有 [ImportantAttribute] 的类继承我的界面(例如 IMyInterface

有没有办法让用户知道他是否用 [ImportantAttribute] 标记了他的课程,并且忘记在编译期间继承 IMyInterface ,而不是在运行时。某种方式指定此属性仅适用于继承 IMyInterface 的类。

与属性和字段的属性相同。

2 个答案:

答案 0 :(得分:1)

  

有没有办法让用户知道他是否标记了他的课程   [ImportantAttribute]并忘记在继承期间继承IMyInterface   编译,而不是在运行时

简单回答:没有,这是不可能的。不是在编译时。您可以在运行时使用反射来检查它。

在编译时你可以做的最好的事情(除了一些特殊的系统属性,例如Obsolete,但它们直接包含在编译器中)是用[AttributeUsage]属性指定它们的用法。 / p>

答案 1 :(得分:0)

我已经在我构建的几个框架中使用了您提到的策略并取得了很好的成功。一个这样的例子是为插件基础设施提供元数据:

[AttributeUsage(AttributeTargets.Class, AllowMultiple=false, Inherited=false)]
public class PluginAttribute : Attribute
{
    public string DisplayName { get; set; }
    public string Description { get; set; }
    public string Version { get; set; }
}

public interface IPlug
{
    void Run(IWork work);
}

[Plugin(DisplayName="Sample Plugin", Description="Some Sample Plugin")]
public class SamplePlug : IPlug
{
    public void Run(IWork work) { ... }
}

这样做可以让我找出有关插件的信息,而无需实例化它们并读取元数据属性。

根据我这样做的经验,我发现强制执行这两个要求的唯一方法是执行运行时检查并确保它是粗体并且< blink>闪烁< /闪烁>在文档中。它远非最佳,但它是最好的(我发现)。然后我再次确定有更好的方法来处理这个问题,但到目前为止,这对我来说非常可靠。