5

Bir değeri bir enum değerine göre filtreleyen bir IRouteConstraint oluşturmak istiyorum. Kendim için google'ı denedim, ancak bu hiçbir şeye yol açmadı.Enum için IRouteConstraint

Herhangi bir fikrin var mı? Bir HashSet her biri üzerinde Enum.GetNames çok daha iyi performans göstereceğini düşündüğünüz

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

:

cevap

4

Bu benim ile geldi budur this

Esasen,

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

blogumda da - http://mikemilleresq.wordpress.com/2010/03/12/starting-small-mvc-constraints/ –

+0

Son sonuçumun altında görün – Jaap

+0

'Enum.IsDefined()' büyük/küçük harfe duyarlıdır, Rota kısıtlama durumunuza bakılmaksızın çalışması gerekiyorsa bundan kaçınılmalıdır. – Chris

9

ihtiyaç görün Maç. Ayrıca, kullanım jenerikleri, kısıtlamayı kullandığınızda biraz daha akıcı görünmesini sağlar.

Maalesef, derleyici tarafından T: Enum'a izin verilmez.

+1

* Maalesef, T: Enum'un derleyici tarafından izinli olmaması * Bu doğrudur, ancak bunu çalışma zamanında da zorlamaya çalışabilirsiniz. http://stackoverflow.com/a/2936591/242520 –

+2

Enum.GetNames yapıcı (typeof (T)), bir enum değilse, bir istisna atar: ArgumentException: Sağlanan tür bir Enum olmalıdır. – Jaap

+1

Bu iyi çalışıyor. Teşekkürler, @Jaap – Chris