Необходимо конретизировать требования, а именно:
- Плагины пишутся для внутреннего использования, или могут быть сторонные плагины?
- Верно ли предположение, что все вызовы плагинами друг друга происходят в пределах одного и того же потока?
Я бы реализовывал это следующим образом.
Для развязки зависимостей между плагинами создаем менеджер плагинов, который умеет загружать плагин по имени. Хочется, чтобы вызывающий код дергал плагин через единый интерфейс. При этом каждый плагин, логично, имеет свой набор входных параметров. Если не удается выделить общие параметры для всех плагинов, то, видимо, от приведения типа параметра никуда не деться.
Возврат результата, возможно, имеет смысл делать не структурой, а обратным вызовом (если в пределах одного потока). Это даст возможность реализовать поэтапную обработку (если параметром служит какой-либо поток данных).