C# 确保目标为自定义属性继承一些接口

C# 确保目标为自定义属性继承一些接口,c#,reflection,attributes,custom-attributes,C#,Reflection,Attributes,Custom Attributes,我需要创建一些自定义属性,用于反射函数 以下是我看到的用例: 用户创建一些类并用我的特殊属性标记它(例如,[ImportAttribute]) 然后用户使用我的库中的函数做一些事情。这些函数查找具有[ImportantAttribute]的类,并对它们进行处理 主要问题是,我的库中的函数期望用[importAttribute]标记的类继承我的接口(例如IMyInterface) 有没有办法让用户知道他是否在编译期间(而不是在运行时)用[importAttribute]标记他的类,并忘记继承I

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

以下是我看到的用例:

  • 用户创建一些类并用我的特殊属性标记它(例如,[ImportAttribute]
  • 然后用户使用我的库中的函数做一些事情。这些函数查找具有[ImportantAttribute]的类,并对它们进行处理
主要问题是,我的库中的函数期望用[importAttribute]标记的类继承我的接口(例如IMyInterface

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

属性和字段的属性也是如此

有没有办法让用户知道他是否用 [ImportantAttribute]并在 编译,而不是在运行时

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


在编译时使用属性最好(除了一些特殊的系统属性,如
过时的
,但它们直接合并到编译器中)是使用属性指定它们的用法。

我在我构建的几个框架中使用了您提到的策略,并取得了很好的成功。其中一个示例用于向插件基础架构提供元数据:

[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) { ... }
}
这样做可以让我了解有关插件的信息,而无需实例化插件并读取元数据属性


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

为什么用户不能使用IMyInterface的显式继承创建他的类?也就是说,“importAttribute”给聚会带来了什么?@Garry Vass这个属性对我的函数说,它必须聚合标记的类。用户可以创建一些继承IMyInterface的类,他不需要使用我的函数来聚合它。但所有标记有importAttribute的类首先必须实现IMyInterfaceThanks以获得答案。我知道,我可以指定属性的用法(对于类或属性),但我会尽可能使我的库易于使用。我们的朋友和我们的使命——尽我们所能给他更多的信息。在编译时比在运行时更容易出错。@Yavanosta,我同意提供编译时安全性比提供运行时安全性更好,但在这种情况下,您不应该使用属性,因为它们在运行时与反射一起工作。所以你没有安全感。也许你应该重新考虑你的设计。