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