我正在编写一个简单的包装器来“躲避”一个已知接口的动态对象:
@H_403_2@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);
}
}
如果动态对象可以响应Bar签名,则此方法可以正常工作.但如果它不能,只有当我打电话给Bar时才会失败.我希望它能否更快失败,即在构建DuckFoo包装器时进行参数验证.像这样的东西:@H_502_5@ @H_403_2@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中使用动态对象进行测试?@H_502_5@
解决方法
您可以在构造时检查使用Reflection包装的对象上可用的方法.
只需在界面上调用Type.GetMethods()并传入类型,并确保存在适当的方法.@H_502_5@
编辑:@H_502_5@
正如itowlson所建议的那样,还有一个处理动态类型的选项.如果检查传递的对象上是否存在IDynamicMetaObjectProvider接口,则可以调用IDynamicMetaObjectProvider.GetMetaObject().GetDynamicMemberNames()并使用此信息.@H_502_5@
如果接口不存在,则可以恢复为Type.GetMethods().@H_502_5@
这应该处理“动态”类型.@H_502_5@