private string WriteTypeInfo(TypeScope scope, TypeDesc typeDesc, Type type)
{
InitTheFirstTime();
string typeFullName = typeDesc.CSharpName;
string typeVariable = (string)_reflectionVariables[typeFullName];
if (typeVariable != null)
return typeVariable;
if (type.IsArray)
{
typeVariable = GenerateVariableName("array", typeDesc.CSharpName);
TypeDesc elementTypeDesc = typeDesc.ArrayElementTypeDesc;
if (elementTypeDesc.UseReflection)
{
string elementTypeVariable = WriteTypeInfo(scope, elementTypeDesc, scope.GetTypeFromTypeDesc(elementTypeDesc));
_writer.WriteLine("static " + typeof(Type).FullName + " " + typeVariable + " = " + elementTypeVariable + ".MakeArrayType();");
}
else
{
string assemblyVariable = WriteAssemblyInfo(type);
_writer.Write("static " + typeof(Type).FullName + " " + typeVariable + " = " + assemblyVariable + ".GetType(");
WriteQuotedCSharpString(type.FullName);
_writer.WriteLine(");");
}
}
else
{
typeVariable = GenerateVariableName(nameof(type), typeDesc.CSharpName);
Type parameterType = Nullable.GetUnderlyingType(type);
if (parameterType != null)
{
string parameterTypeVariable = WriteTypeInfo(scope, scope.GetTypeDesc(parameterType), parameterType);
_writer.WriteLine("static " + typeof(Type).FullName + " " + typeVariable + " = typeof(System.Nullable<>).MakeGenericType(new " + typeof(Type).FullName + "[] {" + parameterTypeVariable + "});");
}
else
{
string assemblyVariable = WriteAssemblyInfo(type);
_writer.Write("static " + typeof(Type).FullName + " " + typeVariable + " = " + assemblyVariable + ".GetType(");
WriteQuotedCSharpString(type.FullName);
_writer.WriteLine(");");
}
}
_reflectionVariables.Add(typeFullName, typeVariable);
TypeMapping mapping = scope.GetTypeMappingFromTypeDesc(typeDesc);
if (mapping != null)
WriteMappingInfo(mapping, typeVariable, type);
if (typeDesc.IsCollection || typeDesc.IsEnumerable)
{// Arrays use the generic item_Array
TypeDesc elementTypeDesc = typeDesc.ArrayElementTypeDesc;
if (elementTypeDesc.UseReflection)
WriteTypeInfo(scope, elementTypeDesc, scope.GetTypeFromTypeDesc(elementTypeDesc));
WriteCollectionInfo(typeVariable, typeDesc, type);
}
return typeVariable;
}