Боюсь, что вы не можете использовать дженерики так, как вы хотите. Причина в том, что универсальный метод должен быть скомпилирован в IL, и он должен разрешить перегрузку в время компиляции . В этот момент он не знает, какую перегрузку выбрать, потому что это информация времени выполнения.
Если у вас столько перегрузок, сколько вы говорите, тогда я бы действительно подумал об использовании некоторой лучшей абстракции. Например, реализуйте ваш метод foo
как член некоторого интерфейса, который реализован всеми классами. Если вы предоставите более подробную информацию, я уверен, что люди здесь могут дать совет по улучшению дизайна.
Если вам действительно нужно сделать это таким образом, то вы, вероятно, можете использовать что-то вроде Dictionary<Type, SomeDelegate<int, obj>
и сохранить все методы foo
в словаре. Метод callFoo
просто выполняет поиск:
public void callFoo<T>(int len) where T : new()
{
T obj = Activator.CreateInstance<T>();
fooDictionary[typeof(T)](len, obj);
// ...
}
Тогда единственная проблема состоит в том, как добавить их все в словарь. Вероятно, вы можете сделать это просто вручную, в статическом конструкторе каждого класса или динамически используя отражение.