Ejemplo n.º 1
0
        private Type GenericPathType(Type declaringType, Type definitionType, TypeDefinition definition, TypeReference reference, GenericScope genericScope)
        {
            var generic   = reference as GenericInstanceType;
            var arguments = generic != null ? new Type[generic.GenericArguments.Count] : System.Type.EmptyTypes;
            var allArgumentsAreRuntime = true;

            if (generic != null)
            {
                for (var i = 0; i < generic.GenericArguments.Count; i++)
                {
                    var resolved = Type(generic.GenericArguments[i], genericScope);
                    allArgumentsAreRuntime = allArgumentsAreRuntime && TypeSupport.IsRuntime(resolved);
                    arguments[i]           = resolved;
                }
            }

            var  cacheKey = new GenericTypeKey(declaringType, definitionType, arguments);
            Type cached;

            if (_genericTypeCache.TryGetValue(cacheKey, out cached))
            {
                return(cached);
            }

            var resultType = GenericPathTypeUncached(declaringType, definitionType, definition, arguments, allArgumentsAreRuntime, genericScope);

            _genericTypeCache.Add(cacheKey, resultType);
            return(GenericPathType(declaringType, definitionType, definition, arguments, allArgumentsAreRuntime, genericScope));
        }
Ejemplo n.º 2
0
        private Type GenericPathTypeUncached(Type declaringType, Type definitionType, TypeDefinition definition, Type[] arguments, bool allArgumentsAreRuntime, GenericScope genericScope)
        {
            if (!TypeSupport.IsRuntime(definitionType))
            {
                return(NewInterpretedGenericPathType(declaringType, definitionType, definition, arguments, genericScope));
            }

            if (arguments.Length == 0)
            {
                return(declaringType.GetNestedType(definitionType.Name));
            }

            if (allArgumentsAreRuntime)
            {
                return(definitionType.MakeGenericType(arguments));
            }

            return(NewInterpretedGenericPathType(declaringType, definitionType, definition, arguments, genericScope));

            //var erased = new Type[arguments.Length];
            //for (var i = 0; i < arguments.Length; i++) {
            //    erased[i] = TypeSupport.IsRuntime(arguments[i]) ? arguments[i] : typeof(CilinObject);
            //}
            //var erasedFull = definitionType.MakeGenericType(erased);
            //return new ErasedWrapperType(erasedFull, NewInterpretedGenericPathType(declaringType, definitionType, definition, arguments, genericScope));
        }
Ejemplo n.º 3
0
        private Type ArrayTypeUncached(Type elementType, GenericScope genericScope)
        {
            if (TypeSupport.IsRuntime(elementType))
            {
                return(elementType.MakeArrayType());
            }

            return /*new ErasedWrapperType(
                    * typeof(CilinObject).MakeArrayType(),*/
                   (NewIntepretedArrayType((NonRuntimeType)elementType, genericScope)
                    /*)*/);
        }