Шаблон, который вы описываете, когда использование обобщений приводит к множеству операторов ifs / switch, является анти-шаблоном.
Одним из решений этой проблемы является реализация шаблона стратегии, который позволяет вам использовать универсальные шаблоны, но в то же время изолировать проблемы метода Parse от знания, как обращаться с каждым другим случаем.
Пример:
class SomeParser
{
void Parse<T>(ParseStrategy<T> parseStrategy, T data)
{
//do some prep
parseStrategy.Parse(data);
//do something with the result;
}
}
class ParseStrategy<T>
{
abstract void Parse(T data);
}
class StringParser: ParseStrategy<String>
{
override void Parse(String data)
{
//do your String parsing.
}
}
class IntParser: ParseStrategy<int>
{
override void Parse(int data)
{
//do your int parsing.
}
}
//use it like so
[Test]
public void ParseTest()
{
var someParser = new SomeParser();
someParser.Parse(new StringParser(), "WHAT WILL THIS PARSE TO");
}
и тогда вы сможете перейти в любую из разработанных вами стратегий. Это позволит вам должным образом изолировать ваши проблемы по нескольким классам и не нарушать SRP (принцип единой ответственности.