2013-04-24 9 views
9

Dies ist eine Folgefrage von How do I get default values of optional parameters?Unterschied zwischen ParameterInfo.DefaultValue und ParameterInfo.RawDefaultValue

Von documentation, DefaultValue:

Ruft einen Wert, der den Standardwert, wenn der Parameter einen Standardwert hat.

Diese Eigenschaft wird nur im Ausführungskontext verwendet. Verwenden Sie im Reflection-Only-Kontext stattdessen die RawDefaultValue-Eigenschaft.

Der Standardwert wird verwendet, wenn im Methodenaufruf kein tatsächlicher Wert angegeben wird. Ein Parameter kann einen Standardwert haben, der null ist. Diese unterscheidet sich von dem Fall, in dem ein Standardwert nicht definiert ist.

Von documentation, RawDefaultValue:

Ruft einen Wert, der den Standardwert, wenn der Parameter einen Standardwert hat.

Diese Eigenschaft kann sowohl im Ausführungskontext als auch im reinen Reflektionskontext verwendet werden.

Der Standardwert wird verwendet, wenn im Methodenaufruf kein tatsächlicher Wert angegeben wird. Ein Parameter kann einen Standardwert haben, der null ist. Diese unterscheidet sich von dem Fall, in dem ein Standardwert nicht definiert ist.

Die Dokumentation ist so ähnlich, mit der Ausnahme, dass man für Reflexion Kontext und andere nicht ist. Welcher Unterschied ist das? Wann wird überhaupt DefaultValue ohne Reflexion verwendet? Ich meine, wie erhalten wir einen Standardwert ohne Reflexion? Fehle ich etwas?

aktualisieren

habe ich zwei Überlastungen wie folgt aus:

public void Required(string value) 
{ 

} 
public void Optional(string value = "", int i = -1) 
{ 

} 

ich getestet mit:

var f = requiredInfo.GetParameters().Select(p => p.DefaultValue).ToArray(); 
var g = requiredInfo.GetParameters().Select(p => p.RawDefaultValue).ToArray(); 

var h = optionalInfo.GetParameters().Select(p => p.DefaultValue).ToArray(); 
var i = optionalInfo.GetParameters().Select(p => p.RawDefaultValue).ToArray(); 

//f equals g and h equals i in every way! 

Also, was ist der Unterschied gegeben ist, dass mein Test zeigt (alle in Reflexion Kontext) überhaupt kein Unterschied?

+1

Vielleicht hilft dieser Link Ihnen mit Reflection-only Kontext: http://msdn.microsoft.com/en-us/library/ms172331.aspx – rpeshkov

Antwort

8

Es gibt einen subtilen, aber signifikanten Unterschied zwischen "im Kontext der Reflexion" und "der reinen Reflektionskontext". Die „Reflexion nur Kontext“ bezieht sich auf etwas ganz Konkretes:

Es ist eine Möglichkeit, eine Anordnung zur Prüfung zu laden nur und hat den entscheidenden Vorteil, dass sie erfordern alle abhängigen Baugruppen zu sein geladen oder sogar anwesend zu sein.

Da Sie die Absicht haben, etwas von dem Code auszuführen, den Sie reflektieren, wäre der reine Reflektionskontext für Sie von begrenztem Nutzen.

+0

das war nett zu wissen. Ich werde dann bei 'DefaultValue' bleiben. Die Klasse 'ParameterInfo' ist ziemlich irreführend. Zeit für mich, eine weitere Frage über den Unterschied zwischen 'IsOptional' und' HasDefaultValue' zu ​​stellen. – nawfal

+3

Also, warum würden Sie 'RawDefaultValue' nicht verwenden, wenn Sie nicht im reinen Reflektionskontext sind? – svick

+0

@svick in meinem Fall, nur der Ausführungskontext war wichtig, und ich habe diese Richtlinie implementiert, um minimalste Dinge zu implementieren, es sei denn, es ist erforderlich :) 'RawDefaultValue 'macht auch Sinn. Bitte markieren Sie meinen Namen, sonst werde ich nicht benachrichtigt. – nawfal