views:

167

answers:

4

Hi,

According to a book I'm reading, the AllowMultiple public property of AttributeUsage specifies:

"...whether the target can have multiple instances of the attribute 
 applied to it."

Why would I want/not want to use this ?

Thanks,

Scott

+1  A: 

This example might be a little contrived but hopefully it gets the point across.

[Convertable(typeof(Int32)), Convertable(typeof(Double))]
public class Test
{

}
ChaosPandion
+1  A: 

This depends what the attributes are.

For example, you could make an attribute that marks a class as depending on something, and you could allow multiple dependencies.

For a concrete example, look at SuppressMessage, which suppresses a code analysis warning. A member can have multiple warnings that you might want to suppress.

Another example is WebResource; an assembly can contain multiple resources.

SLaks
+6  A: 

Attributes are meta-data. Typically, you'll want to decorate a member or type with an Attribute in order to track some information about it.

For example, the DescriptionAttribute is used by the PropertyGrid to label a description of a property:

[Description("This is my property")]
public int MyProperty { get; set; }

Most of the time, having more than one description would not make sense.

However, it is possible that a specific attribute makes sense to use more than once. In that case, you'd want to set the Attribute to allow multiple instances of itself tagged to the same attribute.

(Not that I'd do this, but...) Say you made a custom attribute to track major changes to a class. You might want to list this for every major change:

[Changes(Version=1.1, Change="Added Foo Feature")]
[Changes(Version=2.0, Change="Added Bar Feature")]
public class MyClass
{
    // ...
Reed Copsey
To build on your Description example and avoid the "I wouldn't do this" Changes example, consider a LocalisedDescriptionAttribute, which has both a locale and a description. This could be multiply applied for different locales: `[LocalisedDescription("en-NZ", "sweet as")] [LocalisedDescription("en-GB", "jolly good")]`.
itowlson
Much better-worded then my answer :)
Noon Silk
@itowlson: Yeah, although, again, I'd probably use the standard localization options... That'd be another good example, though.
Reed Copsey
Thanks! This makes sense to me, now.
Scott Davies
A: 

No contrived example here, I used it in real production code. I wrote some code to parse a file containing pairs of data like (code=value). I put a custom attribute on a function to indicate it should be called for a given code.

[CanParseCode("G1")]
[CanParseCode("G2")]
private void ParseGXCodes(string code, string value)
{
   ...
}

This particular format is a somewhat old and domain specific with hundreds of different codes. My goal was to write a framework to make it easier to write file processors that could extract only the codes it needs and ignore the rest. Allowing the same attribute multiple times made it easy to express the intent of the code by simply declaring attributes on the function(s) that process each code.

Brian Ensink