在C#中,当指定应如何使用属性类时,System.AttributeTargets枚举中有一个GenericParameter值.我们如何应用这样的属性,其语法是什么?
[System.AttributeUsage(System.AttributeTargets
public sealed class MyAnnotationAttribute : System.Attribute {

public string Param { get; private set; }
public MyAnnotationAttribute(string param) { Param = param; }

}
复制代码
其他奇特的属性目标也有同样的问题,例如System.AttributeTargets.Module(我什至不知道如何声明除主模块之外的模块???),System.AttributeTargets.Parameter和System.AttributeTargets.ReturnValue.

最佳答案
// Assembly and module
[assembly: AttributesTest.MyAnnotation("Assembly")]

[module: AttributesTest.MyAnnotation("Module")]

namespace AttributesTest
{

// The attribute
[System.AttributeUsage(System.AttributeTargets.All, AllowMultiple = true)]
public sealed class MyAnnotationAttribute : System.Attribute
{
    public string Param { get; private set; }
    public MyAnnotationAttribute(string param) { Param = param; }
}

// Types
[MyAnnotation("Class")]
public class SomeClass { }

[MyAnnotation("Delegate")]
public delegate int SomeDelegate(string s, float f);

[MyAnnotation("Enum")]
public enum SomeEnum { ValueOne, ValueTwo }

[MyAnnotation("Interface")]
public interface SomeInterface { }

[MyAnnotation("Struct")]
public struct SomeStruct { }

// Members
public class MethodsExample
{
    [MyAnnotation("Constructor")]
    public MethodsExample() { }

    [MyAnnotation("Method")]
    public int SomeMethod(short s) { return 42 + s; }

    [MyAnnotation("Field")]
    private int _someField;

    [MyAnnotation("Property")]
    public int SomeProperty {
        [MyAnnotation("Method")] get { return _someField; }
        [MyAnnotation("Method")] set { _someField = value; }
    }

    private SomeDelegate _backingField;

    [MyAnnotation("Event")]
    public event SomeDelegate SomeEvent {
        [MyAnnotation("Method")] add { _backingField += value; }
        [MyAnnotation("Method")] remove { _backingField -= value; }
    }
}

// Parameters
public class ParametersExample<T1, [MyAnnotation("GenericParameter")]T2, T3>
{
    public int SomeMethod([MyAnnotation("Parameter")]short s) { return 42 + s; }
}

// Return value
public class ReturnValueExample
{
    [return: MyAnnotation("ReturnValue")]
    public int SomeMethod(short s) {
        return 42 + s;
    }
}

}