in packages/@jsii/dotnet-runtime/src/Amazon.JSII.Runtime/Services/Converters/JsiiToFrameworkConverter.cs [264:336]
protected override TypeReference InferType(IReferenceMap referenceMap, object value)
{
value = value ?? throw new ArgumentNullException(nameof(value));
if (value is JToken token)
{
switch (token.Type)
{
case JTokenType.Object:
JObject jObject = (JObject)token;
if (jObject.ContainsKey("$jsii.date"))
{
return new TypeReference(primitive: PrimitiveType.Date);
}
if (jObject.ContainsKey("$jsii.enum"))
{
return new TypeReference(jObject.ToObject<EnumValue>()!.FullyQualifiedName);
}
if (jObject.ContainsKey("$jsii.byref"))
{
return new TypeReference(jObject.ToObject<ByRefValue>()!.FullyQualifiedName);
}
// At this point, we can't distinguish between a PrimitiveType.Json and a CollectionKind.Map,
// so we default to CollectionKind.Map.
return new TypeReference(
collection: new CollectionTypeReference(
kind: CollectionKind.Map,
elementType: new TypeReference(primitive: PrimitiveType.Any)
)
);
case JTokenType.Array:
return new TypeReference
(
collection: new CollectionTypeReference
(
kind: CollectionKind.Array,
elementType: new TypeReference(primitive: PrimitiveType.Any)
)
);
case JTokenType.Boolean:
return new TypeReference(primitive: PrimitiveType.Boolean);
case JTokenType.String:
return new TypeReference(primitive: PrimitiveType.String);
case JTokenType.Float:
case JTokenType.Integer:
return new TypeReference(primitive: PrimitiveType.Number);
default:
throw new ArgumentException($"Value has unexpected token type {token.Type}", nameof(value));
}
}
System.Type type = value.GetType();
if (type.IsAssignableFrom(typeof(string)))
{
return new TypeReference(primitive: PrimitiveType.String);
}
if (type.IsAssignableFrom(typeof(bool)))
{
return new TypeReference(primitive: PrimitiveType.Boolean);
}
if (IsNumeric(type))
{
return new TypeReference(primitive: PrimitiveType.Number);
}
throw new ArgumentException($"Value has unexpected type {type.Name}", nameof(value));
}