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();
     }
 }
Exemplo n.º 3
0
 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));
 }