예제 #1
0
파일: ListData.cs 프로젝트: musinit/WrapIt
        public ListData(Type type, TypeName className, TypeName interfaceName, TypeData elementType, WrapperBuilder builder, HashSet <TypeData> typeDatas)
            : base(type, className, interfaceName, TypeBuildStatus.NotYetBuilt)
        {
            var listWrapperData = builder.GetTypeData(typeof(ListWrapperData), typeDatas);

            if (listWrapperData.BuildStatus == TypeBuildStatus.NotBuilding)
            {
                listWrapperData.BuildStatus = TypeBuildStatus.NotYetBuilt;
            }
            DependentTypes.UnionWith(listWrapperData.GetPublicTypes());
            ElementType = elementType;
            DependentTypes.UnionWith(elementType.GetPublicTypes());
        }
예제 #2
0
        public DictionaryData(Type type, TypeName className, TypeName interfaceName, TypeData keyType, TypeData valueType, WrapperBuilder builder, HashSet <TypeData> typeDatas)
            : base(type, className, interfaceName, TypeBuildStatus.NotYetBuilt)
        {
            var dictionaryWrapperData = builder.GetTypeData(typeof(DictionaryWrapperData), typeDatas);

            if (dictionaryWrapperData.BuildStatus == TypeBuildStatus.NotBuilding)
            {
                dictionaryWrapperData.BuildStatus = TypeBuildStatus.NotYetBuilt;
            }
            DependentTypes.UnionWith(dictionaryWrapperData.GetPublicTypes());
            KeyType = keyType;
            DependentTypes.UnionWith(keyType.GetPublicTypes());
            ValueType = valueType;
            DependentTypes.UnionWith(valueType.GetPublicTypes());
        }
예제 #3
0
        public DelegateData(Type type, TypeName className, TypeName interfaceName, TypeBuildStatus buildStatus, WrapperBuilder builder, HashSet <TypeData> typeDatas)
            : base(type, className, interfaceName, buildStatus)
        {
            var invokeMethod = type.GetMethod("Invoke");

            ReturnType = builder.GetTypeData(invokeMethod.ReturnType, typeDatas);
            DependentTypes.UnionWith(ReturnType.GetPublicTypes());
            var parameterInfos = invokeMethod.GetParameters();

            if (parameterInfos?.Length > 0)
            {
                foreach (var parameter in parameterInfos)
                {
                    var parameterType     = parameter.ParameterType;
                    var parameterTypeData = builder.GetTypeData(parameterType, typeDatas);
                    DependentTypes.UnionWith(parameterTypeData.GetPublicTypes());
                    Parameters.Add(new ParameterData(parameterTypeData, parameter.Name, parameter.IsOut));
                }
            }
        }
예제 #4
0
        public void Initialize(WrapperBuilder builder, HashSet <TypeData> typeDatas, BindingFlags bindingFlags)
        {
            if (_initialized)
            {
                return;
            }

            var isIEnumerable        = false;
            var isGenericIEnumerable = false;

            foreach (var @interface in Type.GetInterfaces())
            {
                if (@interface.IsPublic && !builder.AssembliesWithTypesToWrap.Contains(@interface.Assembly) && builder.InterfaceResolver?.Invoke(Type, @interface) != false)
                {
                    if (!isIEnumerable && @interface == typeof(IEnumerable))
                    {
                        isIEnumerable = true;
                    }
                    if (!isGenericIEnumerable && @interface.IsGenericType && @interface.GetGenericTypeDefinition() == typeof(IEnumerable <>))
                    {
                        isGenericIEnumerable = true;
                    }
                    var interfaceTypeData = (InterfaceData)builder.GetTypeData(@interface, typeDatas);
                    interfaceTypeData.Initialize(builder, typeDatas, bindingFlags);
                    Interfaces.Add(interfaceTypeData);
                }
            }

            var propertyInfos = Type.GetProperties(bindingFlags);

            foreach (var property in propertyInfos)
            {
                if (property.GetAccessors().All(a => IncludeMethod(builder, a, typeDatas, out _)) && builder.PropertyResolver?.Invoke(Type, property) != false)
                {
                    var propertyType     = property.PropertyType;
                    var propertyTypeData = builder.GetTypeData(propertyType, typeDatas);
                    DependentTypes.UnionWith(propertyTypeData.GetPublicTypes());
                    var indexParameters = property.GetIndexParameters();
                    var parameters      = new List <ParameterData>();
                    if (indexParameters?.Length > 0)
                    {
                        foreach (var parameter in indexParameters)
                        {
                            var parameterType     = parameter.ParameterType;
                            var parameterTypeData = builder.GetTypeData(parameterType, typeDatas);
                            DependentTypes.UnionWith(parameterTypeData.GetPublicTypes());
                            parameters.Add(new ParameterData(parameterTypeData, parameter.Name, parameter.IsOut));
                        }
                    }

                    var propertyData = new PropertyData(propertyTypeData, property.Name, property.GetGetMethod() != null, property.GetSetMethod() != null, parameters);
                    foreach (var @interface in Interfaces)
                    {
                        if (@interface.Properties.Any(p => p.Equals(propertyData)))
                        {
                            propertyData.DeclaringInterfaceType = @interface;
                        }
                    }
                    Properties.Add(propertyData);
                }
            }

            Properties = Properties.Distinct().OrderBy(p => p.Name).ToList();

            var methodInfos = Type.GetMethods(bindingFlags);

            foreach (var method in methodInfos)
            {
                if (method.DeclaringType != typeof(object) && !method.IsSpecialName && IncludeMethod(builder, method, typeDatas, out var overrideObject) && builder.MethodResolver?.Invoke(Type, method) != false)
                {
                    var returnType     = method.ReturnType;
                    var returnTypeData = builder.GetTypeData(returnType, typeDatas);
                    DependentTypes.UnionWith(returnTypeData.GetPublicTypes());
                    var parameterInfos = method.GetParameters();
                    var parameters     = new List <ParameterData>();
                    if (parameterInfos?.Length > 0)
                    {
                        foreach (var parameter in parameterInfos)
                        {
                            var parameterType     = parameter.ParameterType;
                            var parameterTypeData = builder.GetTypeData(parameterType, typeDatas);
                            DependentTypes.UnionWith(parameterTypeData.GetPublicTypes());
                            parameters.Add(new ParameterData(parameterTypeData, parameter.Name, parameter.IsOut));
                        }
                    }

                    var methodData = new MethodData(method.Name, returnTypeData, parameters, overrideObject);
                    foreach (var @interface in Interfaces)
                    {
                        if (@interface.Methods.Any(p => p.Equals(methodData)))
                        {
                            methodData.DeclaringInterfaceType = @interface;
                        }
                    }
                    Methods.Add(methodData);
                }
            }

            if (!Type.IsInterface && isIEnumerable && !isGenericIEnumerable)
            {
                var      addMethod  = Methods.SingleOrDefault(m => m.Name == "Add" && m.Parameters.Count == 1);
                TypeData?genericArg = null;
                if (addMethod != null)
                {
                    genericArg = addMethod.Parameters[0].Type;
                }
                var indexers = Properties.Where(p => p.Name == "Item").ToList();
                if (genericArg != null || indexers.Count > 0)
                {
                    genericArg ??= indexers[0].Type;
                    if (indexers.All(i => i.Type.Equals(genericArg)))
                    {
                        var interfaceTypeData = (InterfaceData)builder.GetTypeData(typeof(IEnumerable <>).MakeGenericType(genericArg.Type), typeDatas);
                        interfaceTypeData.Initialize(builder, typeDatas, bindingFlags);
                        Interfaces.Add(interfaceTypeData);
                        for (var i = 0; i < Methods.Count; ++i)
                        {
                            if (Methods[i].Name == "GetEnumerator")
                            {
                                Methods.RemoveAt(i);
                                break;
                            }
                        }
                    }
                }
            }

            Interfaces.Sort((x, y) => string.Compare(x.InterfaceName.Name, y.InterfaceName.Name));

            Methods = Methods.Distinct().OrderBy(m => m.Name).ToList();

            var eventInfos = Type.GetEvents(bindingFlags);

            foreach (var @event in eventInfos)
            {
                if (IncludeMethod(builder, @event.AddMethod, typeDatas, out _) && IncludeMethod(builder, @event.RemoveMethod, typeDatas, out _) && builder.EventResolver?.Invoke(Type, @event) != false)
                {
                    var eventHandlerType     = @event.EventHandlerType;
                    var eventHandlerTypeData = (DelegateData)builder.GetTypeData(eventHandlerType, typeDatas);
                    DependentTypes.UnionWith(eventHandlerTypeData.GetPublicTypes());
                    var invokeMethod   = eventHandlerType.GetMethod("Invoke");
                    var returnType     = invokeMethod.ReturnType;
                    var returnTypeData = builder.GetTypeData(returnType, typeDatas);
                    DependentTypes.UnionWith(returnTypeData.GetPublicTypes());
                    var parameterInfos = invokeMethod.GetParameters();
                    var parameters     = new List <ParameterData>();
                    if (parameterInfos?.Length > 0)
                    {
                        foreach (var parameter in parameterInfos)
                        {
                            var parameterType     = parameter.ParameterType;
                            var parameterTypeData = builder.GetTypeData(parameterType, typeDatas);
                            DependentTypes.UnionWith(parameterTypeData.GetPublicTypes());
                            parameters.Add(new ParameterData(parameterTypeData, parameter.Name, parameter.IsOut));
                        }
                    }

                    var eventData = new EventData(eventHandlerTypeData, @event.Name);
                    foreach (var @interface in Interfaces)
                    {
                        if (@interface.Events.Any(e => e.Equals(eventData)))
                        {
                            eventData.DeclaringInterfaceType = @interface;
                        }
                    }
                    Events.Add(eventData);
                }
            }

            Events = Events.Distinct().OrderBy(e => e.Name).ToList();

            _initialized = true;
        }