2016-07-29 74 views
2

通常当您覆盖/执行bool TryDoSomething(...)方法时,如果它不起作用,则返回false处理缺少DynamicObject成员的首选方法是什么?

DynamicObject的情况下,我们返回false,它会抛出一个只包含一般错误消息的异常。

对于

public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) 

这将是

不能调用非委托类型

,就是这样。没有任何信息哪个成员没有工作,也没有什么参数。

改善这个我只会抛出我自己的异常,而不是返回false,因为它会失败。

public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) 
{ 
    // ... 
    throw new Exception($"Method '{binder.Name}' not found."); 
    // ... 
} 

这是对只/最佳方式做到这一点还是有已经别的东西吗?

这是以某种方式打破TryDoSomething模式,但在另一方面它会失败,所以为什么不呢?它会破坏什么?

+0

thx为downvoting和不留下任何评论。 – t3chb0t

+0

似乎是一个很好的问题,奇怪的是别人会觉得不对。我偏爱你的解决方案,因为看起来很简单,你可以获得异常后的信息。 – KreepN

+0

不知道动态的东西,但不能使用'InvokeMemberBinder.FallBackInvokeMember',它最后一个参数似乎包含有关错误的数据(并用它来给出更明确的消息)? – Sehnsucht

回答

0

“Try”方法的模式是返回一个布尔和吞下异常。

也许最好是围绕InvokeMember编写自己的包装。你应该能够创建一个扩展方法来处理这个

public static class Extensions 
{ 
    public static object CustomInvokeMember(this Type t, string name, BindingFlags invokeAttr, Binder binder, 
     object target, object[] args) 
    { 
     try 
     { 
      return t.InvokeMember(name, invokeAttr, binder, target, args); 
     } 
     catch (Exception e) 
     { 
      //TODO: parsing, custom handling, etc 
     } 
     return null; 
    } 
} 
+0

请原谅我,如果这是一个愚蠢的问题,但我真的不知道如何将其应用于'DynamicObject'的覆盖;-( – t3chb0t

+0

您是否需要将代码注入覆盖(意思是某个调用者已经调用了这个方法,并且你不能修改调用者) 调用者期望TryInvokeMember的约定不会抛出,所以抛出是有风险的如果你有调用代码的控制权,你可以改变该方法还是抛出在TryInvokeMember中处理调用者中的异常(但从长远来看,更改该方法将不那么令人困惑)。 TryInvokeMember返回out参数中的对象。你可以返回异常......调用者也必须测试它,所以它不是一个好的解决方案。 – Jras

相关问题