Wer weiß einen schnellen Weg, um die benutzerdefinierten Attribute, die auf einem enum-Wert?
Dies ist wahrscheinlich am besten mit einem Beispiel. Ich habe ein enum mit den Attributen:
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,
}
Möchte ich diese Attribute von einer Instanz:
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
}
Wie das ist mit der spiegelung ich erwarten, dass einige Langsamkeit, aber es scheint chaotisch zu konvertieren, die enum-Wert in einen string (entsprechend dem Namen), wenn ich bereits eine Instanz von Ihr.
Hat jemand eine bessere Möglichkeit?
- Haben Sie im Vergleich mit
Enum.GetName()
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist wahrscheinlich der einfachste Weg.
Einen schnelleren Weg wäre Statisch zu Emittieren, die IL-code mit Dynamischen Methode und ILGenerator. Zwar habe ich nur diese verwendet, um GetPropertyInfo, aber kann nicht sehen, warum Sie konnte nicht emittieren CustomAttributeInfo als gut.
Beispiel-code zu emittieren, eine getter-Eigenschaft von einem
Ich in der Regel finden Reflexion, ziemlich schnell, solange Sie nicht dynamisch Methoden aufrufen.
Da Sie gerade das Lesen der Attribute eines enum, wird der Ansatz sollte einfach gut funktionieren, ohne wirkliche performance-Einbußen.
Und denken Sie daran, dass Sie sollten in der Regel versuchen, um die Dinge einfach zu verstehen. Über engineering, nur um zu gewinnen ein paar ms kann es sich nicht lohnen.