我正在写一个简单的包装,以“鸭”一个dynamic
对象与已知的接口:有没有C#等价于Ruby的`respond_to?`?
interface IFoo { string Bar(int fred); }
class DuckFoo : IFoo
{
private readonly dynamic duck;
public DuckFoo(dynamic duck)
{
this.duck = duck;
}
public string Bar(int fred)
{
return duck.Bar(fred);
}
}
这工作得很好,如果dynamic
对象可以到Bar
签名响应。但是,如果它不能仅当我打电话Bar
失败。我更希望它能更快地失败,即在构建DuckFoo
包装器时进行参数验证。是这样的:
public DuckFoo(dynamic duck)
{
if(/* duck has no matching Bar method */)
throw new ArgumentException("duck", "Bad dynamic object");
this.duck = duck;
}
在Ruby有一个respond_to?
方法,其可以被用来测试是否有物体“有”一定的方法。有没有办法用C#4中的动态对象来测试它?
(我知道,即使有这个检查栏调用可能失败以后,因为duck
的动态性质让它停止响应方法以后。)
当您执行'duck.GetType()'时,会发生什么?如果'duck'被声明为'dynamic duck'?它返回什么类型? – dtb 2009-12-09 23:12:04
如果动态对象是一个.NET对象,您将获得该对象的类型。 – 2009-12-09 23:12:07
我不认为你可以在动态对象上做类似的反射...也许如果它们是常规的CLR对象,但你不能使用来自IronRuby的对象,例如... – 2009-12-09 23:12:34