5 Stimmen

IRouteConstraint für enum

Ich möchte eine IRouteConstraint erstellen, die einen Wert gegen mögliche Werte eines Enums filtert. Ich habe versucht, es selbst zu googeln, aber das hat nichts ergeben.

Irgendwelche Ideen?

11voto

Jaap Punkte 2922

Das habe ich mir ausgedacht:

public class EnumRouteConstraint<T> : IRouteConstraint
  where T : struct
{

  private readonly HashSet<string> enumNames;

  public EnumRouteConstraint()
  {
    string[] names = Enum.GetNames(typeof(T));
    enumNames = new HashSet<string>(from name in names select name.ToLowerInvariant());
  }

  public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
  {
    return enumNames.Contains(values[parameterName].ToString().ToLowerInvariant());
  }
}

Ich denke, dass ein HashSet viel besser funktioniert als Enum.GetNames bei jedem Match. Auch die Verwendung von Generika macht es ein bisschen mehr fließend, wenn Sie die Einschränkung verwenden.

Leider ist T : Enum für den Compiler nicht zulässig.

5voto

Anton Gogolev Punkte 109749

参照 este

Im Wesentlichen benötigen Sie

  private Type enumType;

  public EnumConstraint(Type enumType)
  {
    this.enumType = enumType;
  }

  public bool Match(HttpContextBase httpContext, 
    Route route, 
    string parameterName,     
    RouteValueDictionary values, 
    RouteDirection routeDirection)
  {
    // You can also try Enum.IsDefined, but docs say nothing as to
    // is it case sensitive or not.
    return Enum.GetNames(enumType).Any(s => s.ToLowerInvariant() == values[parameterName].ToString());
  }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X