IRouteConstraint для enum - PullRequest
       22

IRouteConstraint для enum

5 голосов
/ 07 июня 2011

Я хочу создать IRouteConstraint, который фильтрует значение по возможным значениям перечисления.Я пытался найти его для себя, но это ничего не дало.

Есть идеи?

Ответы [ 2 ]

9 голосов
/ 07 июня 2011

Вот что я придумал:

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());
  }
}

Я думаю, что HashSet будет работать намного лучше, чем Enum.GetNames в каждом Матче. Кроме того, использование дженериков делает его более плавным при использовании ограничения.

К сожалению, когда T: Enum не разрешен компилятором.

4 голосов
/ 07 июня 2011

См. это

По сути, вам нужно

  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());
  }
...