Обобщения происходят во время компиляции. Лучше всего использовать, когда вы хотите, чтобы один и тот же код применялся к разным типам. Он не динамический, поэтому он не поможет вам переключаться между методами в зависимости от типов ввода.
Разрешение перегрузки, как в ответе Дэвида Б., работает, но также происходит во время компиляции.
Код в вашем обновлении делает то же самое. Он преобразуется (после тщательной проверки типов), а затем использует перегрузку для разрешения метода.
Мне кажется, что вы хотите переключать методы на основе ввода во время выполнения.
Вы могли бы получить более динамичное поведение, если бы использовали Reflection.
public object execute(object obj)
{
MethodInfo m = typeof(Parser).GetMethod(
"action",
BindingFlags.Instance | BindingFlags.NonPublic,
null,
new Type[] { obj.GetType() },
null);
m.Invoke(this, new object[] { obj });
return obj;
}
Возможно, он немного хрупкий, но в примере работает.