Я хочу иметь простой пример утиного набора текста в С#, используя динамические объекты. Мне кажется, что динамический объект должен иметь методы HasValue/HasProperty/HasMethod с одним строковым параметром для имени значения, свойства или метода, которые вы ищете, прежде чем пытаться выполнить против него. Я стараюсь избегать блоков try/catch и более глубокого отражения, если это возможно. Кажется, это обычная практика для утиной печати на динамических языках (JS, Ruby, Python и т.д.), Которая должна проверять свойство/метод, прежде чем пытаться его использовать, затем вернуться к умолчанию или выбросить контролируемое исключение, Ниже приведен пример, который я хочу выполнить.
Если описанные выше методы не существуют, у кого-нибудь есть готовые методы расширения для динамических, которые это сделают?
Пример. В JavaScript я могу легко протестировать метод на объекте.
//JavaScript
function quack(duck) {
if (duck && typeof duck.quack === "function") {
return duck.quack();
}
return null; //nothing to return, not a duck
}
Как бы я сделал то же самое в С#?
//C# 4
dynamic Quack(dynamic duck)
{
//how do I test that the duck is not null,
//and has a quack method?
//if it doesn't quack, return null
}