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

動的なものはよく分かりませんが、最後のargがエラーに関するデータを含んでいるように見える(InvokeMemberBinder.FallBackInvokeMember)ことはできませんでした。 – Sehnsucht

答えて

0

「試行」メソッドのパターンは、例外を返すことです。

おそらく、独自のラッパーを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

関連する問題