private static bool TryParseGenericTypeName(string typeName, out string genericTypeDefinitionName, out string[] typeArgumentNames)
{
var leftBracketIndex = typeName.IndexOf('[');
if (leftBracketIndex != -1)
{
genericTypeDefinitionName = typeName.Substring(0, leftBracketIndex);
var typeArgumentNamesString = typeName.Substring(leftBracketIndex + 1, typeName.Length - leftBracketIndex - 2);
var typeArgumentNamesList = new List<string>();
var startIndex = 0;
var nestingLevel = 0;
for (var index = 0; index < typeArgumentNamesString.Length; index++)
{
var c = typeArgumentNamesString[index];
switch (c)
{
case '[':
nestingLevel++;
break;
case ']':
nestingLevel--;
break;
case ',':
if (nestingLevel == 0)
{
var typeArgumentName = typeArgumentNamesString.Substring(startIndex, index - startIndex);
typeArgumentNamesList.Add(typeArgumentName);
}
break;
}
}
typeArgumentNamesList.Add(typeArgumentNamesString.Substring(startIndex));
typeArgumentNames = typeArgumentNamesList.ToArray();
return true;
}
genericTypeDefinitionName = null;
typeArgumentNames = null;
return false;
}
}