Весь смысл систем статических типов, таких как C #, состоит в том, что все функциональные возможности, определенные для определенного типа, известны (и проверены) в время компиляции .
Если вы пишете
foo.jump(42);
компилятор проверяет, что независимо от типа foo
он поддерживает операцию с именем jump
, принимающую целочисленный параметр.
Недавно в C # появилась возможность динамически проверять объекты с помощью типа dynamic
, что в основном допускает то, что вы описали в очень ограниченном контексте, но, тем не менее, общий язык типизирован статически.
Так что осталось от динамических языков, таких как Ruby, где существование метода проверяется только во время выполнения (или во время вызова).
Я думаю, что JavaScript может изменить так называемые прототипы , чтобы добавлять методы к объектам и в основном достигать того же, что и Ruby.