Используйте функциональный язык с поддержкой сопоставления с образцом. Поскольку вы находитесь на .net, F # является очевидным выбором.
Это хорошо работает для систем, ориентированных на сообщения, где у вас есть в основном узлы без состояния, которые преобразуют сообщения, а затем передают сообщения другим узлам. В этих сценариях вас не волнует ни изменение данных в сообщении, ни идентификация сообщения; Вы заботитесь о том, чтобы продвигать обработку в каждом узле и отправлять больше сообщений.
Вы не занимаетесь объектно-ориентированным проектированием, и объектно-ориентированные языки плохо поддерживают эту парадигму - они привязывают изменяемый пакет данных к объекту с идентичностью, а не создают реактивную систему преобразователей сообщений.
В сущности, это требует, чтобы вы взяли dual системы - сообщения в реактивной системе соответствуют методу и аргументам в объектно-ориентированных системах. Грубо говоря, состояние, которое находится в полях объектов ОО-программы, сохраняется в стеке вызовов реактивной программы, а состояние, которое является стеком вызовов ОО-программы, сохраняется в полях сообщений в реактивной программе. .