2016-07-29 76 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

相關問題