StackFrame verhält sich im Freigabemodus anders

9

Hier ist mein Code:

%Vor%

Innerhalb der GetValue-Methode arbeitet StackFrame anders als im Debug-Modus.

Im Debug-Modus bekomme ich den Eigenschaftsnamen korrekt als Signatur

Im Freigabemodus lautet der Name der Eigenschaft GetUserPreferenceValueTest, da dies die Testmethode ist, die die Aufrufe als Clients ausführt.

Daher funktioniert mein Code im Debug-Modus, scheitert aber im Freigabemodus.

%Vor%     
dotnet-practitioner 28.12.2012, 23:39
quelle

2 Antworten

8

Ich habe einmal eine ähnliche Frage beantwortet, bitte lies meine Antwort hier .

Kurz gesagt, das ist eine sehr schlechte Design-Entscheidung, weil Ihre Methode ein Heuchler ist - sie spricht andere Anrufer an, sagt sie aber nicht offen. Ihre API sollte niemals, niemals darauf angewiesen sein, wer sie aufruft. Außerdem kann der Compiler den Stack-Trace aufgrund von Sprachfunktionen wie lambdas, yield und await auf unerwartete Weise unterbrechen. Selbst wenn dies im Freigabemodus funktionierte, würde es sicherlich einige Tage dauern.

Sie erstellen effektiv einen komplexen indirekten Mechanismus, anstatt das Sprachfeature designed zu verwenden, um Informationen an Methoden zu übergeben - Methodenparameter .

Warum benutzt du Attribute? Liest du sie woanders?

Wenn Sie dies tun und "Email" nicht als Parameter für GetValue -Aufruf und -Attributwert wiederholen möchten, können Sie eine Eigenschaft Expression<> an GetValue übergeben, wodurch das Attribut extrahiert wird. Dies ist ähnlich wie Ihre Lösung, aber es ist explizit:

%Vor%

Diese Antwort zeigt, wie dies implementiert wird.

Ich sehe, dass Sie Thread.CurrentPrincipal in Ihrem Code überprüfen. Auch dies ist keine wirklich gute Methode, da es für den Client-Code nicht offensichtlich ist , dass der Zugriff auf eine Eigenschaft zu einer Ausnahme führen kann. Dies wird ein Albtraum für jemanden sein, der Ihren Code unterstützt (und mir vertrauen, Ihr Code kann lange in der Produktion laufen, lange nachdem Sie in ein anderes Projekt gewechselt sind ).

Stattdessen sollten Sie VTXIdentity einen Parameter für den Klassenkonstruktor Ihrer Einstellungen festlegen. Dadurch wird sichergestellt, dass der aufrufende Code weiß die Sicherheit auf dieser Ebene erzwingt und per Definition weiß, wo dieses Token abgerufen werden kann. Außerdem können Sie eine Ausnahme auslösen, sobald Sie wissen, dass etwas nicht stimmt und nicht beim Zugriff auf eine Eigenschaft. Dies hilft Maintainern, Fehler früher zu erkennen - ähnlich wie Kompilierungsfehler besser sind als Laufzeitfehler.

Schließlich, während dies eine lustige Übung ist, gibt es viele leistungsfähige und getestete Lösungen zum Speichern und Lesen der Konfiguration in C # . Warum denkst du, du musst das Rad neu erfinden?

    
Dan Abramov 29.12.2012, 00:30
quelle
5

Angenommen, Ihr Problem übersteht die Diskussion darüber, ob Sie einfach eine andere Bibliothek verwenden könnten, statt Ihre eigene zu rollen ... Wenn Sie sich mit C # 5 und .NET 4.5 beschäftigen, werfen Sie einen Blick auf die CallerMemberName Attribut. Mit CallerMemberName können Sie Ihre GetValue () - Methodensignatur so ändern, dass sie

lautet %Vor%

Die Eigenschaft kann dann GetValue () ohne Parameter aufrufen, und Sie erhalten den Eigenschaftsnamen wie gewünscht in GetValue ().

    
Curt Nichols 29.12.2012 00:55
quelle

Tags und Links