in packages/@jsii/dotnet-runtime/src/Amazon.JSII.Runtime/Services/TypeCache.cs [52:124]
public Type GetFrameworkType(TypeReference typeReference, bool isOptional)
{
if (typeReference.FullyQualifiedName != null)
{
var classType = TryGetClassType(typeReference.FullyQualifiedName);
if (classType != null)
{
return classType;
}
var enumType = TryGetEnumType(typeReference.FullyQualifiedName);
if (enumType != null)
{
return MakeNullableIfOptional(enumType);
}
var interfaceType = TryGetInterfaceType(typeReference.FullyQualifiedName);
if (interfaceType != null)
{
return interfaceType;
}
throw new ArgumentException("Type reference has a fully qualified name, but is neither a class nor an enum", nameof(typeReference));
}
if (typeReference.Primitive != null)
{
switch (typeReference.Primitive)
{
case PrimitiveType.Any:
return typeof(object);
case PrimitiveType.Boolean:
return MakeNullableIfOptional(typeof(bool));
case PrimitiveType.Date:
return MakeNullableIfOptional(typeof(DateTime));
case PrimitiveType.Json:
return typeof(JObject);
case PrimitiveType.Number:
return MakeNullableIfOptional(typeof(double));
case PrimitiveType.String:
return typeof(string);
default:
throw new ArgumentException($"Unknown primitive type {typeReference.Primitive}", nameof(typeReference));
}
}
if (typeReference.Collection != null)
{
Type elementType = GetFrameworkType(typeReference.Collection.ElementType, false);
switch (typeReference.Collection.Kind)
{
case CollectionKind.Array:
return elementType.MakeArrayType();
case CollectionKind.Map:
return typeof(IDictionary<,>).MakeGenericType(typeof(string), elementType);
default:
throw new ArgumentException($"Unknown collection kind {typeReference.Collection.Kind}", nameof(typeReference));
}
}
if (typeReference.Union != null)
{
return typeof(object);
}
throw new ArgumentException("Invalid type reference", nameof(typeReference));
Type MakeNullableIfOptional(Type type)
{
return isOptional ? typeof(Nullable<>).MakeGenericType(type) : type;
}
}