Вот что я придумал:
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 не разрешен компилятором.