コード例 #1
0
        /// <summary>
        /// Convert an IL type reference to an XTypeReference.
        /// </summary>
        private static XTypeReference CreateTypeReference(XModule module, TypeReference type)
        {
            if (type == null)
            {
                return(null);
            }

            if (type.IsArray)
            {
                var arrayType  = (ArrayType)type;
                var dimensions = arrayType.Dimensions.Select(x => new XArrayDimension(x.LowerBound, x.UpperBound));
                return(new XArrayType(AsTypeReference(module, arrayType.ElementType), dimensions));
            }

            // Handle known primitive types
            var ts = module.TypeSystem;

            switch (type.MetadataType)
            {
            case MetadataType.Boolean:
                return(ts.Bool);

            case MetadataType.Byte:
                return(ts.Byte);

            case MetadataType.SByte:
                return(ts.SByte);

            case MetadataType.Char:
                return(ts.Char);

            case MetadataType.Int16:
                return(ts.Short);

            case MetadataType.UInt16:
                return(ts.UShort);

            case MetadataType.Int32:
                return(ts.Int);

            case MetadataType.UInt32:
                return(ts.UInt);

            case MetadataType.Int64:
                return(ts.Long);

            case MetadataType.UInt64:
                return(ts.ULong);

            case MetadataType.Single:
                return(ts.Float);

            case MetadataType.Double:
                return(ts.Double);

            case MetadataType.Void:
                return(ts.Void);

            case MetadataType.IntPtr:
                return(ts.IntPtr);

            case MetadataType.UIntPtr:
                return(ts.UIntPtr);

            case MetadataType.Object:
                return(ts.Object);

            case MetadataType.String:
                return(ts.String);
            }

            if (type.IsByReference)
            {
                var byReferenceType = (ByReferenceType)type;
                return(new XByReferenceType(AsTypeReference(module, byReferenceType.ElementType)));
            }

            if (type.IsGenericParameter)
            {
                var gp = (GenericParameter)type;
                return(new ILGenericParameter(module, gp));
            }

            if (type.IsGenericInstance)
            {
                var git = (GenericInstanceType)type;
                var genericArguments = git.GenericArguments.Select(x => AsTypeReference(module, x));
                return(new XGenericInstanceType(AsTypeReference(module, git.ElementType), genericArguments));
            }

            if (type.IsPointer)
            {
                var pointerType = (PointerType)type;
                return(new XPointerType(AsTypeReference(module, pointerType.ElementType)));
            }

            if (type.IsOptionalModifier)
            {
                var modType = (OptionalModifierType)type;
                return(new XOptionalModifierType(AsTypeReference(module, modType.ModifierType), AsTypeReference(module, modType.ElementType)));
            }

            if (type.IsRequiredModifier)
            {
                var modType = (RequiredModifierType)type;
                return(new XRequiredModifierType(AsTypeReference(module, modType.ModifierType), AsTypeReference(module, modType.ElementType)));
            }

            if (type is TypeSpecification)
            {
                throw new NotImplementedException("Unknown type " + type);
            }

            if (type.IsDefinition)
            {
                XTypeDefinition typeDef;
                if (module.TryGetType(type.FullName, out typeDef))
                {
                    return(typeDef); // Add extra resolve since some type definitions resolve to others.
                }
            }

            {
                var declaringType         = (type.DeclaringType != null) ? AsTypeReference(module, type.DeclaringType) : null;
                var genericParameterNames = type.GenericParameters.Select(x => x.Name);
                return(new XTypeReference.SimpleXTypeReference(module, type.Namespace, type.Name, declaringType, type.IsValueType, genericParameterNames));
            }
        }