C# 我如何创建一个;自定义属性";因此,它只能应用于;虚拟的;方法?

C# 我如何创建一个;自定义属性";因此,它只能应用于;虚拟的;方法?,c#,.net,custom-attributes,C#,.net,Custom Attributes,如何创建一个“自定义属性”,以便它只能应用于“虚拟”方法 这里应该很好: [OnlyOnVirtual] public virtual void VirtualMethod() { //do something } 在这里,我想提出一个编译或执行错误: [OnlyOnVirtual] public void NonVirtualMethod() { //do something } 是否可以创建具有此类限制的“自定义属性”否。不支持此类限制。否。不支持此类限制。有关可以应用属

如何创建一个“自定义属性”,以便它只能应用于“虚拟”方法

这里应该很好:

[OnlyOnVirtual]
public virtual void VirtualMethod()
{
    //do something
}
在这里,我想提出一个编译或执行错误:

[OnlyOnVirtual]
public void NonVirtualMethod()
{
    //do something
}

是否可以创建具有此类限制的“自定义属性”否。不支持此类限制。

否。不支持此类限制。

有关可以应用属性的类型,请参见
AttributeTargets
枚举

例如:

 [AttributeUsage(AttributeTargets.Class)]
    public class MyAttribute : Attribute
    {

    }

有关可以应用属性的类型,请参见
AttributeTargets
enum

例如:

 [AttributeUsage(AttributeTargets.Class)]
    public class MyAttribute : Attribute
    {

    }

这种用法不能导致编译错误,但可以在使用属性化方法的任何代码中引发运行时异常。对于使用要求超出编译器能力范围的情况,这是一种非常典型的方法。请注意,您不能导致一般的“执行错误”(在执行反射的代码之外),因为属性是元数据,只有在运行时代码对其进行反射时才“使用”属性。

您不能导致此用法的编译错误,但是,您可以在任何使用属性化方法的代码中抛出运行时异常。对于使用要求超出编译器能力范围的情况,这是一种非常典型的方法。请注意,您不能导致一般的“执行错误”(在执行反射的代码之外),因为属性是元数据,只有在代码在其上反射时才在运行时“使用”。

如下文所述,您不能强制编译器将此作为编译步骤进行检查,但您可以在应用程序启动时在运行时检查它——只需检查应用该属性的所有方法都是虚拟的


正如下文所述,您不能强制编译器将此作为编译步骤进行检查,但您可以在应用程序启动时在运行时进行检查-只需检查应用属性的所有方法是否都是虚拟的


为什么要这样做?“这似乎是一种设计的味道。”保罗·菲利普斯说。此属性将用于通过Spring.Net进行AOP。如果该方法不是虚拟的,则不会发生任何事情,而且我的团队中的大多数开发人员都无法轻松确定该方面不起作用的原因。我们的目标是在开发时轻松地识别这个“问题”。您可能会让它在运行时抛出异常,尽管我对框架的了解还不够,无法建议如何处理。失败的部分听起来像是问题所在。此外,当评论中只有我们两个人时,您不必使用“@”回复。为什么要这样做?“这似乎是一种设计的味道。”保罗·菲利普斯说。此属性将用于通过Spring.Net进行AOP。如果该方法不是虚拟的,则不会发生任何事情,而且我的团队中的大多数开发人员都无法轻松确定该方面不起作用的原因。我们的目标是在开发时轻松地识别这个“问题”。您可能会让它在运行时抛出异常,尽管我对框架的了解还不够,无法建议如何处理。失败的部分听起来像是问题所在。此外,当评论中只有我们两个人时,您不必使用“@”回复。