我可以将自定义属性仅限于void方法吗?
我有一个自定义属性,我想限制返回类型为void的方法。
我知道我可以限制使用[AttributeUsage(AttributeTargets.Method)]
但似乎没有办法限制返回类型或方法签名的任何其他方面。
[System.Diagnostics.Conditional]
属性恰恰具有我想要的那种限制。 将它添加到非void方法会导致编译器错误:
条件属性在'(SomeMethod)'上无效,因为它的返回类型不是无效的
和IntelliSense说:
属性'System.Diagnostics.ConditionalAttribute'仅在具有'void'返回类型的属性类或方法上有效。
如果我F12 ConditionalAttribute
我看到它用以下属性装饰:
[序列化]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method,AllowMultiple = true)]
[标记有ComVisible特性(真)]
没有一个说什么关于返回类型。
它是如何完成Conditional
属性,我可以为我的自定义属性做同样的事情吗?
在我使用PostSharp后,发现在我的特殊情况下有一个解决方案。
我的自定义属性从PostSharp.Aspects.MethodInterceptionAspect
(它继承自Attribute
)继承,它具有可覆盖的CompileTimeValidate(MethodBase method)
方法。
这允许在构建时发出编译器错误:
public override bool CompileTimeValidate(MethodBase method)
{
Debug.Assert(method is MethodInfo);
var methodInfo = (MethodInfo)method;
if (methodInfo.ReturnType != typeof(void))
{
Message.Write(
method, SeverityType.Error, "CX0001",
"The Foo attribute is not valid on '{0}' because its return type is not void",
method.Name);
return false;
}
return true;
}
大多数属性只是附加到类的元数据,可以在运行时检查。 但是,编译器使用了一些属性。 例如System.ObsoleteAttribute
可以用来让编译器发出错误或警告,如果使用方法,类等。 System.Diagnostics.ConditionalAttribute
是编译器使用的属性的另一个示例。 因此,编译器本身可以自由地对其使用施加规则,而不能将其应用于其他属性(例如仅限于void方法)。
不幸的是,在这个时候,不可能通过自定义属性来影响编译器。 在Rosalyn使用C#编写的过程中,开放的方式是让编译器在属性内运行代码,作为编译阶段的一部分。 如果实现了这个功能,那么你的限制属性为void方法的例子就是这种功能的一种使用。
链接地址: http://www.djcxy.com/p/56581.html上一篇: Can I restrict a custom attribute to void methods only?