2016-07-29 4 views
2

Normalerweise, wenn Sie eine bool TryDoSomething(...) Methode überschreiben/implementieren, geben Sie false zurück, wenn es nicht funktionierte.Was ist der bevorzugte Weg, um fehlendes Mitglied von DynamicObject zu behandeln?

Im Fall der DynamicObject geben wir false zurück und es löst eine Ausnahme aus, die nur eine allgemeine Fehlermeldung enthält.

Für

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

wäre es

, die um eine nicht-Delegattyp aufrufen

und das ist es. Es gibt keine Informationen darüber, welches Mitglied nicht funktioniert hat und welche Parameter es waren.

Um zu verbessern dies würde ich nur meine eigene Ausnahme anstelle false zurückwerfen, weil es sowieso scheitern wird.

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

Ist das der nur/best Weg, es zu tun, oder es ist schon etwas anderes?

Dies ist irgendwie brechen die TryDoSomething Muster, aber auf der anderen Seite wird es trotzdem scheitern, also warum nicht? Wird es irgendetwas brechen?

+0

Thx für das Downvoting und keine Kommentare hinterlassen. – t3chb0t

+0

Scheint wie eine gute Frage, seltsam, dass jemand anders fühlen würde. Ich bin zu Ihrer Lösung teilweise bereit, da es einfach genug zu sein scheint, um die Informationen zu erhalten, nach denen Sie bei der Ausnahme suchen. – KreepN

+0

Sie kennen sich nicht gut mit dynamischem Zeug aus, aber könnten Sie 'InvokeMemberBinder.FallBackInvokeMember' nicht irgendwie verwenden, welches letztes Argument Daten über den Fehler zu enthalten scheint (und das verwendet, um eine explizitere Nachricht zu geben)? – Sehnsucht

Antwort

0

Das Muster für eine "Try" -Methode ist ein Bool zurückgeben und Ausnahmen schlucken.

Vielleicht wäre es besser, einen eigenen Wrapper um InvokeMember zu schreiben. Sie sollten in der Lage sein, eine Erweiterungsmethode zu erstellen, um das Problem zu umgehen

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

Verzeihen Sie, wenn es eine dumme Frage ist, aber ich weiß nicht wirklich, wie man das auf die Überschreibungen des 'DynamicObject' anwendet ;-( – t3chb0t

+0

Brauchen Sie Ihren Code in die override (was bedeutet, dass ein Anrufer diese Methode bereits anruft und Sie den Anrufer nicht ändern können) Der Anrufer erwartet, dass die Konvention des TryInvokeMember nicht geworfen wird, daher ist das Werfen riskant. Wenn Sie die Kontrolle über den Anrufcode haben, können Sie das ändern die Methode oder den Wurf im TryInvokeMember und behandeln die Ausnahme im Aufrufer (aber die Methode zu ändern wäre auf lange Sicht weniger verwirrend). TryInvokeMember gibt ein Objekt im Out-Parameter zurück. Sie könnten die Ausnahme zurückgeben ... Der Aufrufer müsste das ebenfalls testen, also ist es keine großartige Lösung. – Jras

Verwandte Themen