private Type GetTypeArgs(FieldInfo thatField, int i)
{
Type result = null;
Type[] typeArgs;
TypeInfo realFieldTypeInfo = field.FieldType.GetTypeInfo();
while (!realFieldTypeInfo.IsGenericType)
{
realFieldTypeInfo = realFieldTypeInfo.BaseType.GetTypeInfo();
}
typeArgs = realFieldTypeInfo.GenericTypeArguments;
if (typeArgs != null)
{
int max = typeArgs.Length - 1;
if (i > max)
i = max;
Type typeArg0 = typeArgs[i];
TypeInfo typeInfo = typeArg0.GetTypeInfo();
// case 1: arg is a concrete class
if (!typeArg0.IsGenericParameter && !typeInfo.IsGenericType)
{
result = typeArg0;
}
else if (typeInfo.IsGenericType)
{
// nested parameterized type
result = typeArg0.GetGenericTypeDefinition();
}
else if (typeArg0.IsGenericParameter)
{
Type[] tviBounds = typeInfo.GetGenericParameterConstraints();
result = tviBounds[0];
Debug.WriteLine("yo! " + result);
}
else
{
Debug.WriteLine("getTypeArgClass(" + field + ", " + i
+ " yucky! Consult s.im.mp serialization developers.");
}
}
return result;
}