Ejemplo n.º 1
0
        public void Process(ClassDefinition cd)
        {
            cd.Accept(this);
            var parameters = GenericParameters.ToArray();

            for (var i = 0; i < parameters.Length; ++i)
            {
                var param = parameters[i];
                var gen   = cd.GenericParameters.FirstOrDefault(gp => gp.Name.Equals(param.Name));
                var found = gen != null;
                if (!found)
                {
                    gen = _codeBuilder.CreateGenericParameterDeclaration(i, param.Name);
                }
                foreach (IType baseType in param.GetTypeConstraints())
                {
                    gen.BaseTypes.Add(_codeBuilder.CreateTypeReference(baseType));
                }
                if (param.MustHaveDefaultConstructor)
                {
                    gen.Constraints |= GenericParameterConstraints.Constructable;
                }
                if (param.IsValueType)
                {
                    gen.Constraints |= GenericParameterConstraints.ValueType;
                }
                else if (param.IsClass)
                {
                    gen.Constraints |= GenericParameterConstraints.ReferenceType;
                }
                if (param.Variance == Variance.Covariant)
                {
                    gen.Constraints |= GenericParameterConstraints.Covariant;
                }
                else if (param.Variance == Variance.Contravariant)
                {
                    gen.Constraints |= GenericParameterConstraints.Contravariant;
                }
                if (!found)
                {
                    cd.GenericParameters.Add(gen);
                }
            }
        }