LA.NET [EN]

Jul 21

Getting started with attributes – part V

Posted in .NET Basics C#      Comments Off on Getting started with attributes – part V

After all, I’ve decided to write another post about custom attributes. In the last post, I’ve mentioned the use of the CustomAttributeData type. Since I’ve received a couple of questions about its use, I thought it would be a good idea to show an example of how one can use this class to check for specific values. So, I’ll just start by introducing the custom attribute and some code that applies it to a property:

classMyAttribute:Attribute {

    public MyAttribute( string someValue ) {

        SomeValue = someValue;

    }

    publicString SomeValue { get; privateset; }

    publicString SomeOtherValue { get; set; }

}

classStudent {

    [My(“Howdy”, SomeOtherValue = “there!”)]

    publicString Nome { get; set; }

    publicString Morada { get; set; }

}

In the previous post, we’ve already saw how to check if an attribute is applied to a specific target. So, we won’t be performing that check again and I’ll just show you how to recover the values applied to the properties of the attribute:

var prop = typeof( Student ).GetProperty( “Nome” );

var attrib = CustomAttributeData.GetCustomAttributes( prop ).First();

//positional arguments can be obtained from the ConstructorArguments prop

var positionalArgs = attrib.ConstructorArguments;

for(var i = 0; i < positionalArgs.Count; i++){

    Console.WriteLine( “arg at pos {0} has value {1},

        i, positionalArgs[i].Value);

}

//named arguments can be recovered through NamedArguments

var namedArgs = attrib.NamedArguments;

foreach( CustomAttributeNamedArgument t in namedArgs ) {

    Console.WriteLine( “arg {0} has value {1},

                       t.MemberInfo.Name, t.TypedValue.Value);

}

I believe the code is rather simple: positional parameters are represented by CustomAttributeTypedArgument instances, which allow us to recover its value and type. On the other hand, named parameters are represented by CustomAttributeNamedArgument instances, where each item exposes a Name (that identifies the custom attribute’s property that is being initialized) and a CustomAttributeTypedArgument property (TypedValue) which allows us to recover its value and type.

And I guess this wraps it up for now! Stay tuned for more.