Проблема в том, что вы предполагаете, что он попытается выполнить неявное динамическое преобразование аргументов динамического вызова, чтобы заставить вызов метода работать, это не так.
Когда ваши аргументы не являются статически типизированными, он будет использовать тип среды выполнения, чтобы найти наилучший подходящий метод (если тип среды выполнения соответствует статическим правилам для неявного преобразования в тип аргумента, это тоже будет работать), так как ваш IntProperty StringProperty, похоже, возвращает DynamicObject, а не Int и String или что-то, что может быть статически неявно преобразовано, этот поиск завершится неудачей.
Если бы SomeDynamicObjectImplementer мог на самом деле возвращать Int для IntProperty и String для StringProperty, вызов вашего метода без приведения будет фактически работать. Также, вероятно, лучше применять динамическую типизацию, если тип данных основан на фактическом типе данных, а не на использовании try convert. Вы можете добавить фактически неявные методы преобразования для каждого возможного типа, который вы можете вернуть к возвращенному типу DynamicObject, но это может вызвать странные проблемы с разрешением в зависимости от того, насколько вы перегружены.
Однако другой вариант, позволяющий сохранить динамическую реализацию такой же, - это смешать немного контролируемой статической типизации. Вы можете использовать ImpromputInterface (в nuget), чтобы поместить интерфейс поверх динамического объекта , если если вы сделаете это, то для ваших возвращенных объектов DynamicObjects будет вызван метод TryConvert.
public interface ISomeStaticInterface{
int IntProperty {get;}
string StringProperty {get;}
}
...
var myVar = new SomeDynamicObjectImplementer().ActLike<ISomeStaticInterface>();
method(myVar.IntProperty, myVar.StringProperty);