Simpl.Serialization.FieldDescriptor.GetTypeArgs C# (CSharp) Method

GetTypeArgs() private method

private GetTypeArgs ( FieldInfo thatField, int i ) : Type
thatField System.Reflection.FieldInfo
i int
return System.Type
        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;
        }