2012-01-08 60 views
2

我需要创建一些自定义属性,以用于我的反射功能。确保目标继承自定义属性的某个界面

这里是用例,因为我看到它:

  • 用户创建了一些类和我的特殊属性([ImportantAttribute]例如)
  • ,则用户做一些事,标志着它函数从我的库。这些功能找到[ImportantAttribute]班,做一些与他们

的主要问题是,在我的库函数预期,即类至极被打上[ImportantAttribute]继承我的界面(IMyInterface的例如)

有没有什么办法让用户知道他纪念他的类[ImportantAttribute],忘记了在编译过程中继承IMyInterface的,而不是在运行时间。指定此属性仅适用于继承IMyInterface的类的某种方法。

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

+1

为什么用户不能用IMyInterface显式继承来创建他的类?也就是说,'重要属性'为派对带来了什么? – 2012-01-08 21:56:39

+0

@Garry Vass这个属性对我的函数说,它必须聚合标记的类。用户可以创建一些继承IMyInterface的类,并且他不会收集我的函数来聚合它。但是所有使用ImportantAttribute标记的类都必须实现IMyInterface – Yavanosta 2012-01-08 23:06:19

回答

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) { ... } 
} 

这样做使我找出有关插件的信息,而不必实例化它们和读取的元数据属性。

在我这样的经历,只有这样,我发现执行这两个要求都满足是执行运行时检查,并确保它是大胆和<眨眼>文档中闪烁< /眨眼> 。它远非最佳,但它是最好的(我发现)。然后,我确信有一个更好的方式去处理这个问题,但到目前为止,这对我来说非常稳固。

1

有没有什么办法让用户知道他纪念他的类 [ImportantAttribute]忘记期间 编译继承IMyInterface的,而不是在运行时

答案很简单:没有,这不可能。不在编译时。你可以在运行时使用反射来检查它。

在编译时您可以使用属性做的最好(除了一些特殊的系统属性,例如Obsolete但直接合并到编译器中),请使用[AttributeUsage]属性指定它们的用法。

+0

首先,非常感谢您的回答。 我知道,我可以指定属性的用法(对于类,或属性),但试图使我的库最容易使用,因为我可以。编译我们的朋友和我们的使命 - 尽可能给他更多的信息。在编译时产生错误比在运行时更舒服。 – Yavanosta 2012-01-08 21:58:28

+0

@Yavanosta,我同意提供编译时安全而不是运行时会更好,但在这种情况下,您不应该使用属性,因为它们在运行时使用反射进行工作。所以你不安全。也许你应该重新考虑你的设计。 – 2012-01-08 21:59:35