如何创建“自定义属性”以使其只能应用于“虚拟”方法?
这里应该没问题:
[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
{
}
正如下面帖子中提到的,您不能强制编译器将此作为编译步骤进行检查,但您可以在应用程序启动时在运行时检查它 - 只需检查您应用属性的所有方法是否都是虚拟的。