public DelegateUsageAttribute(DelegateUsage delegateUsage)
 {
     DelegateUsage = delegateUsage;
 }
        static List <Delegate> ExtractPrivateFieldValues(object instance, bool ensureMaximumOfOne, DelegateUsage usage)
        {
            var delegates = new List <Delegate>();
            var type      = instance.GetType();

            CollectDetailsOf(type, () => instance, delegates, ensureMaximumOfOne, usage);

            return(delegates);
        }
        static void CollectDetailsOf <T>(Type target, Func <object> instanceResolver, ICollection <T> items, bool ensureMaximumOfOne, DelegateUsage usage)
        {
            if (target == typeof(Object) || target == null)
            {
                return;
            }

            if (target.IsAbstract)
            {
            }

            if (!IsStatic(target))
            {
                var instance = instanceResolver();
                if (instance == null)
                {
                    return;
                }

                var fields = target.GetInstanceFieldsOfUsage(usage);

                if (ensureMaximumOfOne && fields.Count() > 1)
                {
                    throw new SpecificationUsageException(String.Format("You cannot have more than one {0} clause in {1}",
                                                                        fields.First().FieldType.Name,
                                                                        target.FullName));
                }
                var field = fields.FirstOrDefault();

                if (field != null)
                {
                    var val = (T)field.GetValue(instance);
                    items.Add(val);
                }

                CollectDetailsOf(target.BaseType, () => instance, items, ensureMaximumOfOne, usage);
            }

            CollectDetailsOf(target.DeclaringType, () => Activator.CreateInstance(target.DeclaringType), items, ensureMaximumOfOne, usage);
        }
 public static bool IsOfUsage(this FieldInfo fieldInfo, DelegateUsage usage)
 {
     return(GetDelegateUsage(fieldInfo) == usage);
 }
 public static IEnumerable <FieldInfo> GetInstanceFieldsOfUsage(this Type type, DelegateUsage usage)
 {
     return(GetInstanceFields(type).Where(x => GetDelegateUsage(x) == usage));
 }
 public DelegateUsageAttribute(DelegateUsage delegateUsage)
 {
   DelegateUsage = delegateUsage;
 }