示例#1
0
        public override TypeSlim ToType(DeserializationDomain domain, TypeSlim[] genericArguments)
        {
            if (_type == null)
            {
                var def = domain.GetType(_genericTypeDefinition).ToType(domain, genericArguments);
                GenericDefinitionTypeSlim genDef;

                switch (def.Kind)
                {
                case TypeSlimKind.Simple:
                    var simple = (SimpleTypeSlim)def;
                    genDef = TypeSlim.GenericDefinition(simple.Assembly, simple.Name);
                    break;

                default:
                    throw new InvalidOperationException("Expected either simple type slim discriminator for generic definition type.");
                }

                var n        = _genericTypeArguments.Length;
                var argsList = new TypeSlim[n];

                for (var i = 0; i < n; i++)
                {
                    var arg     = _genericTypeArguments[i];
                    var argType = domain.GetType(arg).ToType(domain, genericArguments);
                    argsList[i] = argType;
                }

                var args = new TrueReadOnlyCollection <TypeSlim>(/* transfer ownership */ argsList);
                _type = TypeSlim.Generic(genDef, args);
            }

            return(_type);
        }
示例#2
0
        public override TypeSlim ToType(DeserializationDomain domain, TypeSlim[] genericArguments)
        {
            if (_type == null)
            {
                var elementType = domain.GetType(_elementType).ToType(domain, genericArguments);

                _type = _rank == null?TypeSlim.Array(elementType) : TypeSlim.Array(elementType, _rank.Value);
            }

            return(_type);
        }
示例#3
0
        public override TypeSlim ToType(DeserializationDomain domain, params TypeSlim[] genericArguments)
        {
            if (_type == null)
            {
                var refType = StructuralTypeSlimReference.Create(hasValueEqualitySemantics: true, Kind, _members.Length);
                _type = refType;
                foreach (var member in _members)
                {
                    var newPropertyType = domain.GetType(member.Type).ToType(domain, genericArguments);
                    var newProperty     = _type.GetProperty(member.Name, newPropertyType, s_emptyTypeList, member.CanWrite);
                    refType.AddProperty(newProperty);
                }
                refType.Freeze();
            }

            return(_type);
        }
示例#4
0
        public override MemberInfoSlim ToMember(DeserializationDomain domain)
        {
            // PERF: This is a heavy allocator; should we support caching the result?

            var def = ((GenericDefinitionMethodInfoSlim)domain.GetMember(_genericMethodDefinition));

            var count = _genericArguments.Length;

            var argsList = new TypeSlim[count];

            for (var i = 0; i < count; i++)
            {
                argsList[i] = domain.GetType(_genericArguments[i]).ToType(domain);
            }

            var args = new TrueReadOnlyCollection <TypeSlim>(/* transfer ownership */ argsList);

            return(def.DeclaringType.GetGenericMethod(def, args));
        }
 public Type GetType(Json.Expression expression)
 {
     return(_domain.GetType(expression));
 }