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); }
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); }
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); }
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)); }