Ejemplo n.º 1
0
        static GenericTypeParameterBuilder[] SetupGenericArguments(Type[] genericParameterTypes,
                                                                   DefineGenericParametersDelegate @delegate)
        {
            // Nothing to do if it's not generic
            if (genericParameterTypes.Length == 0)
            {
                return(null);
            }

            // Extract parameter names
            string[] genericParameterNames = new string[genericParameterTypes.Length];
            for (int idx = 0; idx < genericParameterTypes.Length; idx++)
            {
                genericParameterNames[idx] = genericParameterTypes[idx].Name;
            }

            // Setup constraints on generic types (i.e., "where" clauses)
            GenericTypeParameterBuilder[] genericBuilders = @delegate(genericParameterNames);

            for (int idx = 0; idx < genericBuilders.Length; idx++)
            {
                genericBuilders[idx].SetGenericParameterAttributes(genericParameterTypes[idx].GenericParameterAttributes);

                foreach (Type type in genericParameterTypes[idx].GetGenericParameterConstraints())
                {
                    genericBuilders[idx].SetBaseTypeConstraint(type);
                }
            }

            return(genericBuilders);
        }
        private void InitializeGenericParameters(DefineGenericParametersDelegate defineGenericParameters,
            GenericParameterCollection genericParameters)
        {
            if (genericParameters.Count == 0)
                return;

            string[] names = CollectionUtils.ConvertAllToArray<GenericParameter, string>(genericParameters, delegate(GenericParameter genericParameter)
            {
                return genericParameter.Name;
            });

            GenericTypeParameterBuilder[] genericTypeParameterBuilders = defineGenericParameters(names);

            for (int i = 0; i < genericParameters.Count; i++)
            {
                GenericTypeParameterBuilder genericTypeParameterBuilder = genericTypeParameterBuilders[i];
                GenericParameter genericParameter = genericParameters[i];

                genericTypeParameterBuilder.SetGenericParameterAttributes(
                    (System.Reflection.GenericParameterAttributes) genericParameter.Attributes);

                if (genericParameter.Constraints.Count != 0)
                {
                    Type classConstraint = null;
                    List<Type> interfaceConstraints = new List<Type>();

                    foreach (TypeReference typeReference in genericParameter.Constraints)
                    {
                        Type type = ResolveType(typeReference);
                        if (type.IsInterface)
                            interfaceConstraints.Add(type);
                        else
                            classConstraint = type;
                    }

                    if (classConstraint != null)
                        genericTypeParameterBuilder.SetBaseTypeConstraint(classConstraint);
                    if (interfaceConstraints.Count != 0)
                        genericTypeParameterBuilder.SetInterfaceConstraints(interfaceConstraints.ToArray());
                }
            }

            metadataPass.Add(delegate
            {
                for (int i = 0; i < genericParameters.Count; i++)
                {
                    InitializeCustomAttributes(genericTypeParameterBuilders[i].SetCustomAttribute,
                        genericParameters[i].CustomAttributes);
                }
            });
        }
        private void InitializeGenericParameters(DefineGenericParametersDelegate defineGenericParameters,
                                                 GenericParameterCollection genericParameters)
        {
            if (genericParameters.Count == 0)
            {
                return;
            }

            string[] names = CollectionUtils.ConvertAllToArray <GenericParameter, string>(genericParameters, delegate(GenericParameter genericParameter)
            {
                return(genericParameter.Name);
            });

            GenericTypeParameterBuilder[] genericTypeParameterBuilders = defineGenericParameters(names);

            for (int i = 0; i < genericParameters.Count; i++)
            {
                GenericTypeParameterBuilder genericTypeParameterBuilder = genericTypeParameterBuilders[i];
                GenericParameter            genericParameter            = genericParameters[i];

                genericTypeParameterBuilder.SetGenericParameterAttributes(
                    (System.Reflection.GenericParameterAttributes)genericParameter.Attributes);

                if (genericParameter.Constraints.Count != 0)
                {
                    Type        classConstraint      = null;
                    List <Type> interfaceConstraints = new List <Type>();

                    foreach (TypeReference typeReference in genericParameter.Constraints)
                    {
                        Type type = ResolveType(typeReference);
                        if (type.IsInterface)
                        {
                            interfaceConstraints.Add(type);
                        }
                        else
                        {
                            classConstraint = type;
                        }
                    }

                    if (classConstraint != null)
                    {
                        genericTypeParameterBuilder.SetBaseTypeConstraint(classConstraint);
                    }
                    if (interfaceConstraints.Count != 0)
                    {
                        genericTypeParameterBuilder.SetInterfaceConstraints(interfaceConstraints.ToArray());
                    }
                }
            }

            metadataPass.Add(delegate
            {
                for (int i = 0; i < genericParameters.Count; i++)
                {
                    InitializeCustomAttributes(genericTypeParameterBuilders[i].SetCustomAttribute,
                                               genericParameters[i].CustomAttributes);
                }
            });
        }