我可以将自定义属性仅限于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?

下一篇: Custom Validation Attribute With Multiple Parameters