Как я понимаю, вы не хотите иметь ЛЮБОЙ зависимости / требования к наблюдаемому коду или применять какие-либо ограничения на то, как код написан.
Хотя это мой любимый подход к кодированию «наблюдателя», это приводит к тому, что ваше приложение сталкивается с очень широким диапазоном кода и поведения, что может привести к его аварийному завершению.
Итак, как я уже говорил, я советую сделать наблюдателя «надежным» на первом этапе. Вы должны быть готовы к тому, что в вашем коде что-то пойдет не так, потому что, учитывая «прозрачность», многие вещи могут пойти не так! (Будьте осторожны, куда поместить ваш try / catch, вход и выход из блока try много раз может оказать заметное влияние на производительность)
Когда вы закончите делать свой код устойчивым, следующие шаги будут сделать его более удобным и уклоняться от ситуаций, которые могут вызвать исключения, такие как «список», который вы упомянули. Например, вы можете проверить наблюдаемый объект и посмотреть, является ли он списком, и он не слишком длинный, сначала сделайте его быструю копию, а затем сделайте все остальное. Таким образом вы устраняете большую вероятность того, что ваш код может сработать.