Тестирование типа утки с C # 4 для динамических объектов

Я хочу иметь простой пример типизации утки в C # с использованием динамических объектов. Мне кажется, что динамический объект должен иметь методы 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 #?

//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
}

Ответы на вопрос(5)

Ваш ответ на вопрос