Merge pull request #249 from pcc/xgetinputfocus
[mono.git] / mcs / class / System.Web.Mvc3 / Mvc / FilterAttribute.cs
1 namespace System.Web.Mvc {
2     using System;
3     using System.Collections.Concurrent;
4     using System.Linq;
5     using System.Web.Mvc.Resources;
6
7     [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
8     public abstract class FilterAttribute : Attribute, IMvcFilter {
9         private readonly static ConcurrentDictionary<Type, bool> _multiuseAttributeCache = new ConcurrentDictionary<Type, bool>();
10         private int _order = Filter.DefaultOrder;
11
12         private static bool AllowsMultiple(Type attributeType) {
13             return _multiuseAttributeCache.GetOrAdd(
14                 attributeType,
15                 type => type.GetCustomAttributes(typeof(AttributeUsageAttribute), true)
16                             .Cast<AttributeUsageAttribute>()
17                             .First()
18                             .AllowMultiple
19             );
20         }
21
22         public bool AllowMultiple {
23             get {
24                 return AllowsMultiple(GetType());
25             }
26         }
27
28         public int Order {
29             get {
30                 return _order;
31             }
32             set {
33                 if (value < Filter.DefaultOrder) {
34                     throw new ArgumentOutOfRangeException("value", MvcResources.FilterAttribute_OrderOutOfRange);
35                 }
36                 _order = value;
37             }
38         }
39     }
40 }