public static void WalkAssembly(Assembly assembly) { foreach (Type type in ReflectUtil.GetLoadedTypes(assembly)) { foreach (AssemblyWalkAttribute walkAttribute in AllWalkAttributes.Keys) { if (!string.IsNullOrEmpty(walkAttribute.StaticRegisterMethod)) { Type managerType = AllWalkAttributes[walkAttribute]; var managerRegisterMethod = managerType.GetMethod(walkAttribute.StaticRegisterMethod, BindingFlags.Static | BindingFlags.Public); if (managerRegisterMethod != null) { if (walkAttribute.AttributeType != null) { var attr = type.GetCustomAttributes(walkAttribute.AttributeType, false).FirstOrDefault(); if (attr != null) { if (walkAttribute.InterfaceType != null) { bool isInterface = !type.IsInterface && type.GetInterfaces().Contains(walkAttribute.InterfaceType); if (isInterface) { managerRegisterMethod.Invoke(null, new[] { attr, type }); walkAttribute.LoadedCount++; } else { string message = string.Format("Attribute {0} found on type {1}, but type does not implement the required interface {2}", walkAttribute.AttributeType.Name, type.Name, walkAttribute.InterfaceType.Name); SafeHouse.Logger.LogError(message); Debug.AddNagMessage(Debug.NagType.NAGONCE, message); } } else if (walkAttribute.InherritedType != null) { if (walkAttribute.InherritedType.IsAssignableFrom(type)) { managerRegisterMethod.Invoke(null, new[] { attr, type }); walkAttribute.LoadedCount++; } else { string message = string.Format("Attribute {0} found on type {1}, but type does not inherrit from the required type {2}", walkAttribute.AttributeType.Name, type.Name, walkAttribute.InherritedType.Name); SafeHouse.Logger.LogError(message); } } else { managerRegisterMethod.Invoke(null, new[] { attr, type }); walkAttribute.LoadedCount++; } } } else if (walkAttribute.InterfaceType != null) { bool isInterface = !type.IsInterface && type.GetInterfaces().Contains(walkAttribute.InterfaceType); if (isInterface) { managerRegisterMethod.Invoke(null, new[] { type }); walkAttribute.LoadedCount++; } } else if (walkAttribute.InherritedType != null) { if (walkAttribute.InherritedType.IsAssignableFrom(type)) { managerRegisterMethod.Invoke(null, new[] { type }); walkAttribute.LoadedCount++; } } } } } } }
public static void LoadWalkAttribute(Assembly assembly) { foreach (Type type in ReflectUtil.GetLoadedTypes(assembly)) { var attr = type.GetCustomAttributes(typeof(AssemblyWalkAttribute), true).FirstOrDefault() as AssemblyWalkAttribute; if (attr != null) { SafeHouse.Logger.LogWarning(string.Format("Found attribute on type {0}", type.Name)); if (!string.IsNullOrEmpty(attr.StaticRegisterMethod)) { if (attr.AttributeType != null) { // the register method should support parameters of <AttributeType> and Type if (CheckMethodParameters(type, attr.StaticRegisterMethod, attr.AttributeType, typeof(Type))) { AllWalkAttributes.Add(attr, type); SafeHouse.Logger.SuperVerbose(string.Format("Add attribute on type {0}", type.Name)); } else { string message = string.Format("Found AssemblyWalkAttribute on type {0} but the specified StaticRegisterMethod does not accept parameters of types {1} and Type", type.Name, attr.AttributeType.Name); SafeHouse.Logger.LogError(message); Debug.AddNagMessage(Debug.NagType.NAGFOREVER, message); } } else if (attr.InherritedType != null || attr.InterfaceType != null) { // the register method should support only a parameter of Type if (CheckMethodParameters(type, attr.StaticRegisterMethod, typeof(Type))) { AllWalkAttributes.Add(attr, type); SafeHouse.Logger.SuperVerbose(string.Format("Add attribute on type {0}", type.Name)); } else { string message = string.Format("Found AssemblyWalkAttribute on type {0} but the specified StaticRegisterMethod does not accept parameters of type Type", type.Name); SafeHouse.Logger.LogError(message); Debug.AddNagMessage(Debug.NagType.NAGFOREVER, message); } } } else if (!string.IsNullOrEmpty(attr.StaticWalkMethod)) { // the static walk method should accept no parameters if (CheckMethodParameters(type, attr.StaticWalkMethod)) { AllWalkAttributes.Add(attr, type); SafeHouse.Logger.SuperVerbose(string.Format("Add attribute on type {0}", type.Name)); } else { string message = string.Format("Found AssemblyWalkAttribute on type {0} but the specified StaticWalkMethod does not accept zero parameters", type.Name, attr.AttributeType.Name); SafeHouse.Logger.LogError(message); Debug.AddNagMessage(Debug.NagType.NAGFOREVER, message); } } else { string message = string.Format("Found AssemblyWalkAttribute on type {0} but neither StaticRegisterMethod nor StaticWalkMethod are specified", type.Name); SafeHouse.Logger.LogError(message); Debug.AddNagMessage(Debug.NagType.NAGFOREVER, message); } } } }