/// <summary> /// Post-initialization Architech Types Referenced /// </summary> /// <param name="includingSelf"></param> /// <returns></returns> public ArchList <ArchitectType> ReferencedTypes(bool includingSelf) { ArchList <ArchitectType> alist = new ArchList <ArchitectType>(); if (referencedTypes == null) { DirectRefTypes.ForEach(a => alist.Add(DeclaringType.Architecture.Types.Find(A => A.Class == a))); referencedTypes = alist; } else { referencedTypes.ForEach(M => alist.Add(M)); } if (!includingSelf) { alist.RemoveAll(A => A.FullName.Contains(DeclaringType.Name)); } return(alist.Clean()); }
/// <summary> /// Assign direct reference information to original types and members /// </summary> private void DetermineReferences() { // This method is created separately to provide recursive function of NestedTypes List <Type> types = DeclaringType.Architecture.BaseTypes; switch (Member.MemberType) { case MemberTypes.Constructor: // parameter types, local types, method ConstructorInfo C = (ConstructorInfo)Member; C.GetParameters().ToList().ForEach(param => { if (types.Contains(param.ParameterType)) { DirectRefTypes.Add(param.ParameterType); } }); C.GetMethodBody().LocalVariables.ToList().ForEach(local => { if (types.Contains(local.LocalType)) { DirectRefTypes.Add(local.LocalType); } }); InterpretBody(); break; case MemberTypes.Method: // return type, parameter types, local types, method MethodInfo Mthd = (MethodInfo)Member; if (types.Contains(Mthd.ReturnType)) { DirectRefTypes.Add(Mthd.ReturnType); } Mthd.GetParameters().ToList().ForEach(param => { if (types.Contains(param.ParameterType)) { DirectRefTypes.Add(param.ParameterType); } }); Mthd.GetMethodBody().LocalVariables.ToList().ForEach(local => { if (types.Contains(local.LocalType)) { DirectRefTypes.Add(local.LocalType); } }); InterpretBody(); break; case MemberTypes.Property: // type, get method, set method PropertyInfo P = (PropertyInfo)Member; if (types.Contains(P.PropertyType)) { DirectRefTypes.Add(P.PropertyType); } new MethodInfo[2] { P.GetGetMethod(), P.GetSetMethod() }.ToList().FindAll(M => M != null).ForEach(M => { M.GetMethodBody().LocalVariables.ToList().ForEach(local => { if (types.Contains(local.LocalType)) { DirectRefTypes.Add(local.LocalType); } }); }); InterpretBody(); break; case MemberTypes.Event: // add method, remove method, raise method, 'other' methods EventInfo E = (EventInfo)Member; List <MethodInfo> methods = new MethodInfo[3] { E.GetAddMethod(), E.GetRemoveMethod(), E.GetRaiseMethod() }.ToList(); methods.AddRange(E.GetOtherMethods()); methods.FindAll(M => M != null).ForEach(M => { M.GetMethodBody().LocalVariables.ToList().ForEach(local => { if (types.Contains(local.LocalType)) { DirectRefTypes.Add(local.LocalType); } }); }); InterpretBody(); break; case MemberTypes.Field: // type FieldInfo F = ((FieldInfo)Member); if (types.Contains(F.FieldType)) { DirectRefTypes.Add(F.FieldType); } break; default: // Nested, TypeInfo, Custom, All break; } }