示例#1
0
        static TypeName ConvertGenericType(Type type)
        {
            if (type.GetTypeInfo().IsGenericTypeDefinition)
            {
                DefaultTypeName result;
                int             skipCount;
                string          plainName = StripMangle(type.Name);

                if (type.DeclaringType == null)
                {
                    result = new DefaultTypeName(
                        AssemblyName.FromAssemblyName(type.GetTypeInfo().Assembly.GetName()),
                        plainName,
                        type.Namespace);
                    skipCount = 0;
                }
                else
                {
                    var declaring = FromType(type.DeclaringType);
                    result    = new DefaultTypeName(plainName, (DefaultTypeName)declaring);
                    skipCount = declaring.GenericParameterCount;
                }

                var gen = type.GetGenericArguments().Skip(skipCount).Select(
                    (t, i) => GenericParameterName.New(result, i, t.Name)).ToArray();
                result.FinalizeGenerics(gen);

                return(result);
            }

            var args = type.GetGenericArguments().Select(FromType);

            return(FromType(type.GetGenericTypeDefinition()).MakeGenericType(args));
        }
示例#2
0
        public static TypeName FromType(Type type)
        {
            if (type == null)
            {
                throw new ArgumentNullException("type");
            }

            if (type.IsByRef)
            {
                return(FromType(type.GetElementType()).MakeByReferenceType());
            }

            else if (type.IsArray)
            {
                return(FromType(type.GetElementType()).MakeArrayType(Enumerable.Repeat(ArrayDimension.Unsized, type.GetArrayRank())));
            }

            else if (type.IsPointer)
            {
                return(FromType(type.GetElementType()).MakePointerType());
            }

            else if (type.IsGenericParameter)
            {
                if (type.GetTypeInfo().DeclaringMethod == null)
                {
                    return(GenericParameterName.New(FromType(type.DeclaringType), type.GenericParameterPosition, type.Name));
                }
                else
                {
                    // TODO This is unbound, but getting the method is recursive
                    return(MethodName.GenericParameter(type.GenericParameterPosition));
                }
            }
            else if (type.GetTypeInfo().IsGenericType)
            {
                return(ConvertGenericType(type));
            }

            else
            {
                TypeName declaring = null;
                if (type.DeclaringType == null)
                {
                    return(new DefaultTypeName(
                               AssemblyName.FromAssemblyName(type.GetTypeInfo().Assembly.GetName()),
                               type.Name,
                               type.Namespace ?? string.Empty));
                }
                else
                {
                    declaring = FromType(type.DeclaringType);
                    return(new DefaultTypeName(type.Name, (DefaultTypeName)declaring));
                }
            }
        }