public GenerateScorpioClass(Type type) { m_Type = type; m_IsStruct = !type.IsClass; m_ScorpioClassName = "ScorpioClass_" + GetClassName(type); m_FullName = ScorpioReflectUtil.GetFullName(m_Type); m_AllFields.AddRange(m_Type.GetFields(ScorpioReflectUtil.BindingFlag)); m_AllEvents.AddRange(m_Type.GetEvents(ScorpioReflectUtil.BindingFlag)); var propertys = m_Type.GetProperties(ScorpioReflectUtil.BindingFlag); foreach (var property in propertys) { //如果是 get 则参数是0个 set 参数是1个 否则就可能是 [] 的重载 if ((property.CanRead && property.GetGetMethod().GetParameters().Length == 0) || (property.CanWrite && property.GetSetMethod().GetParameters().Length == 1)) { m_AllPropertys.Add(property); } } var methods = (m_Type.IsAbstract && m_Type.IsSealed) ? m_Type.GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy) : m_Type.GetMethods(ScorpioReflectUtil.BindingFlag); foreach (var method in methods) { //屏蔽掉 模版函数 模板函数只能使用反射 if (!ScorpioReflectUtil.CheckGenericMethod(method)) { continue; } m_AllMethods.Add(method); } }
void Init() { { m_Fields.Clear(); foreach (var field in m_AllFields) { if (m_ClassFilter != null && !m_ClassFilter.Check(this, m_Type, field)) { continue; } m_Fields.Add(field); } m_Fields.Sort(new ComparerFieldInfo()); } { m_Events.Clear(); foreach (var eve in m_AllEvents) { if (m_ClassFilter != null && !m_ClassFilter.Check(this, m_Type, eve)) { continue; } m_Events.Add(eve); } m_Events.Sort(new ComparerEventInfo()); } { m_Propertys.Clear(); foreach (var property in m_AllPropertys) { if (m_ClassFilter != null && !m_ClassFilter.Check(this, m_Type, property)) { continue; } m_Propertys.Add(property); } m_Propertys.Sort(new ComparerPropertyInfo()); } { m_Methods.Clear(); foreach (var method in m_AllMethods) { if (m_ClassFilter != null && !m_ClassFilter.Check(this, m_Type, method)) { continue; } bool check = true; var methodHandle = method.MethodHandle; //判断函数是不是 event add remove 函数 foreach (var eve in m_AllEvents) { if (eve.GetAddMethod().MethodHandle == methodHandle || eve.GetRemoveMethod().MethodHandle == methodHandle) { if (m_ClassFilter != null && !m_ClassFilter.Check(this, m_Type, eve)) { check = false; } break; } } if (check) { //判断函数是不是 get set 函数 foreach (var property in m_AllPropertys) { if (m_IsStruct && property.GetSetMethod()?.MethodHandle == methodHandle) { check = false; break; } else if (property.GetGetMethod()?.MethodHandle == methodHandle || property.GetSetMethod()?.MethodHandle == methodHandle) { if (m_ClassFilter != null && !m_ClassFilter.Check(this, m_Type, property)) { check = false; } break; } } } if (check) { m_Methods.Add(method); } } m_Methods.Sort(new ComparerMethodInfo()); } { m_ExtensionMethods.Clear(); foreach (var exten in m_Extensions) { var nameSpace = exten.Namespace; var methods = exten.GetMethods(Script.BindingFlag); foreach (var method in methods) { if (!Util.IsExtensionMethod(method)) { continue; } var paramterType = method.GetParameters()[0].ParameterType; //判断是模板函数 if (paramterType.IsGenericParameter && paramterType.BaseType != null && (m_Type == paramterType.BaseType || m_Type.IsSubclassOf(paramterType.BaseType))) { m_ExtensionMethods.Add(method); } else if (ScorpioReflectUtil.CheckGenericMethod(method) && (m_Type == paramterType || m_Type.IsSubclassOf(paramterType))) { m_ExtensionMethods.Add(method); } else { continue; } if (!string.IsNullOrWhiteSpace(nameSpace) && !m_ExtensionUsing.Contains(nameSpace)) { m_ExtensionUsing.Add(nameSpace); } } } m_ExtensionUsing.Sort(); m_ExtensionMethods.Sort(new ComparerMethodInfo()); } { m_MethodNames.Clear(); foreach (var method in m_Methods) { string name = method.Name; if (m_MethodNames.Contains(name)) { continue; } m_MethodNames.Add(name); } foreach (var method in m_ExtensionMethods) { string name = method.Name; if (m_MethodNames.Contains(name)) { continue; } m_MethodNames.Add(name); } m_MethodNames.Sort(); } }
void Init() { (m_Fields = new List <FieldInfo>(AllFields.Where(_ => Check(_)))).SortField(); (m_Events = new List <EventInfo>(AllEvents.Where(_ => Check(_)))).SortEvent(); (m_Propertys = new List <PropertyInfo>(AllPropertys.Where(_ => Check(_)))).SortProperty(); m_Methods.Clear(); foreach (var method in AllMethods) { if (!Check(method)) { continue; } var valid = true; var methodHandle = method.MethodHandle; //判断函数是不是 event add remove 函数 foreach (var eventInfo in AllEvents) { if (eventInfo.GetAddMethod().MethodHandle == methodHandle || eventInfo.GetRemoveMethod().MethodHandle == methodHandle) { if (!Check(eventInfo)) { valid = false; } break; } } if (valid) { //判断函数是不是 get set 函数 foreach (var propertyInfo in AllPropertys) { //如果是struct 并且是 set 属性则屏蔽,强转结构体的set会报错 if (IsStruct && propertyInfo.GetSetMethod()?.MethodHandle == methodHandle) { valid = false; break; } else if (propertyInfo.GetGetMethod()?.MethodHandle == methodHandle || propertyInfo.GetSetMethod()?.MethodHandle == methodHandle) { if (!Check(propertyInfo)) { valid = false; } break; } } } if (valid) { m_Methods.Add(method); } } m_Methods.SortMethod(); m_ExtensionMethods.Clear(); foreach (var extensionInfo in m_Extensions) { var nameSpace = extensionInfo.Namespace; var methods = extensionInfo.GetMethods(Script.BindingFlag); foreach (var methodInfo in methods) { //非扩展函数 if (!Util.IsExtensionMethod(methodInfo) || !Check(methodInfo)) { continue; } var paramterType = methodInfo.GetParameters()[0].ParameterType; //判断是模板函数 if (paramterType.IsGenericParameter && paramterType.BaseType != null && paramterType.BaseType.IsAssignableFrom(m_Type)) { m_ExtensionMethods.Add(methodInfo); } else if (ScorpioReflectUtil.CheckGenericMethod(methodInfo) && paramterType.IsAssignableFrom(m_Type)) { m_ExtensionMethods.Add(methodInfo); } else { continue; } if (!string.IsNullOrWhiteSpace(nameSpace)) { m_ExtensionUsing.Add(nameSpace); } } } m_ExtensionMethods.SortMethod(); m_Methods.ForEach(_ => m_MethodNames.Add(_.Name)); m_ExtensionMethods.ForEach(_ => m_MethodNames.Add(_.Name)); }