Attribute parameters must be constant. If I break the rules, my C# compiler gives this error:
An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type
Since there are no GUID literals in C#, you have to encode the the GUID in another format, for example a string. However, you're not completely at sea: you can make your attribute have a ctor that takes the format you want. Here's an example with the same ctors as System.Guid
:
[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
sealed class MyGuidAttribute : Attribute
{
public Guid Guid { get; private set; }
//
// Summary:
// Initializes a new instance of the System.Guid class using the specified array
// of bytes.
//
// Parameters:
// b:
// A 16 element byte array containing values with which to initialize the GUID.
//
// Exceptions:
// System.ArgumentNullException:
// b is null.
//
// System.ArgumentException:
// b is not 16 bytes long.
public MyGuidAttribute(byte[] b)
{
this.Guid = new Guid(b);
}
//
// Summary:
// Initializes a new instance of the System.Guid class using the value represented
// by the specified string.
//
// Parameters:
// g:
// A System.String that contains a GUID in one of the following formats ('d'
// represents a hexadecimal digit whose case is ignored): 32 contiguous digits:
// dddddddddddddddddddddddddddddddd -or- Groups of 8, 4, 4, 4, and 12 digits
// with hyphens between the groups. The entire GUID can optionally be enclosed
// in matching braces or parentheses: dddddddd-dddd-dddd-dddd-dddddddddddd -or-
// {dddddddd-dddd-dddd-dddd-dddddddddddd} -or- (dddddddd-dddd-dddd-dddd-dddddddddddd)
// -or- Groups of 8, 4, and 4 digits, and a subset of eight groups of 2 digits,
// with each group prefixed by "0x" or "0X", and separated by commas. The entire
// GUID, as well as the subset, is enclosed in matching braces: {0xdddddddd,
// 0xdddd, 0xdddd,{0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd}} All braces, commas,
// and "0x" prefixes are required. All embedded spaces are ignored. All leading
// zeroes in a group are ignored. The digits shown in a group are the maximum
// number of meaningful digits that can appear in that group. You can specify
// from 1 to the number of digits shown for a group. The specified digits are
// assumed to be the low order digits of the group.
//
// Exceptions:
// System.ArgumentNullException:
// g is null.
//
// System.FormatException:
// The format of g is invalid.
//
// System.OverflowException:
// The format of g is invalid.
public MyGuidAttribute(string g)
{
this.Guid = new Guid(g);
}
//
// Summary:
// Initializes a new instance of the System.Guid class using the specified integers
// and byte array.
//
// Parameters:
// a:
// The first 4 bytes of the GUID.
//
// b:
// The next 2 bytes of the GUID.
//
// c:
// The next 2 bytes of the GUID.
//
// d:
// The remaining 8 bytes of the GUID.
//
// Exceptions:
// System.ArgumentNullException:
// d is null.
//
// System.ArgumentException:
// d is not 8 bytes long.
public MyGuidAttribute(int a, short b, short c, byte[] d)
{
this.Guid = new Guid(a, b, c, d);
}
//
// Summary:
// Initializes a new instance of the System.Guid class using the specified integers
// and bytes.
//
// Parameters:
// a:
// The first 4 bytes of the GUID.
//
// b:
// The next 2 bytes of the GUID.
//
// c:
// The next 2 bytes of the GUID.
//
// d:
// The next byte of the GUID.
//
// e:
// The next byte of the GUID.
//
// f:
// The next byte of the GUID.
//
// g:
// The next byte of the GUID.
//
// h:
// The next byte of the GUID.
//
// i:
// The next byte of the GUID.
//
// j:
// The next byte of the GUID.
//
// k:
// The next byte of the GUID.
public MyGuidAttribute(int a, short b, short c, byte d, byte e, byte f, byte g, byte h, byte i, byte j, byte k)
{
this.Guid = new Guid(a, b, c, d, e, f, g, h, i, j, k);
}
//
// Summary:
// Initializes a new instance of the System.Guid class using the specified unsigned
// integers and bytes.
//
// Parameters:
// a:
// The first 4 bytes of the GUID.
//
// b:
// The next 2 bytes of the GUID.
//
// c:
// The next 2 bytes of the GUID.
//
// d:
// The next byte of the GUID.
//
// e:
// The next byte of the GUID.
//
// f:
// The next byte of the GUID.
//
// g:
// The next byte of the GUID.
//
// h:
// The next byte of the GUID.
//
// i:
// The next byte of the GUID.
//
// j:
// The next byte of the GUID.
//
// k:
// The next byte of the GUID.
[CLSCompliant(false)]
public MyGuidAttribute(uint a, ushort b, ushort c, byte d, byte e, byte f, byte g, byte h, byte i, byte j, byte k)
{
this.Guid = new Guid(a, b, c, d, e, f, g, h, i, j, k);
}
}