我想在C#中使用动态对象进行简单的鸭子打字示例.在我看来,动态对象应该具有HasValue/HasProperty/HasMethod方法,其中包含一个字符串参数,用于在尝试对其运行之前查找的值,属性或方法的名称.我试图避免尝试/捕获块,如果可能的话,更深入的反射.在动态语言(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
}Run Code Online (Sandbox Code Playgroud)
我如何在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
}Run Code Online (Sandbox Code Playgroud)