This is probably best shown with an example. I have an enum with attributes:
public enum MyEnum { [CustomInfo('This is a custom attrib')] None = 0, [CustomInfo('This is another attrib')] ValueA, [CustomInfo('This has an extra flag', AllowSomething = true)] ValueB, }
I want to get to those attributes from an instance:
public CustomInfoAttribute GetInfo( MyEnum enumInput ) { Type typeOfEnum = enumInput.GetType(); //this will be typeof( MyEnum ) //here is the problem, GetField takes a string // the .ToString() on enums is very slow FieldInfo fi = typeOfEnum.GetField( enumInput.ToString() ); //get the attribute from the field return fi.GetCustomAttributes( typeof( CustomInfoAttribute ), false ). FirstOrDefault() //Linq method to get first or null as CustomInfoAttribute; //use as operator to convert }
As this is using reflection I expect some slowness, but it seems messy to convert the enum value to a string (which reflects the name) when I already have an instance of it.
Does anyone have a better way?
This is probably the easiest way.
A quicker way would be to Statically Emit the IL code using Dynamic Method and ILGenerator. Although I’ve only used this to GetPropertyInfo, but can’t see why you couldn’t emit CustomAttributeInfo as well.
For example code to emit a getter from a property