2013-04-24 15 views
9

Questa è una domanda di follow-up di How do I get default values of optional parameters?Differenza tra ParameterInfo.DefaultValue e ParameterInfo.RawDefaultValue

Da documentation, DefaultValue:

Ottiene un valore che indica il valore di default se il parametro ha un valore di default .

Questa proprietà viene utilizzata solo nel contesto di esecuzione. Nel contesto di sola riflessione , utilizzare invece la proprietà RawDefaultValue.

Il valore predefinito viene utilizzato quando un valore effettivo non è specificato nella chiamata al metodo . Un parametro può avere un valore predefinito null. Questo è diverso dal caso in cui un valore predefinito non è definito.

Da documentation, RawDefaultValue:

Ottiene un valore che indica il valore di default se il parametro ha un valore di default .

Questa proprietà può essere utilizzata sia nel contesto di esecuzione che nel contesto di sola riflessione.

Il valore predefinito viene utilizzato quando un valore effettivo non è specificato nella chiamata al metodo . Un parametro può avere un valore predefinito null. Questo è diverso dal caso in cui un valore predefinito non è definito.

La documentazione è così simile tranne che per il contesto di riflessione e altro no. Che differenza è? Quando mai DefaultValue viene utilizzato senza alcuna riflessione? Voglio dire come otteniamo un valore predefinito senza riflessione? Mi sto perdendo qualcosa?

Aggiornamento

ho creato due overload come questo:

public void Required(string value) 
{ 

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

} 

ho provato con:

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! 

Allora, qual è la differenza, dato che i miei spettacoli di prova (tutto in riflessione contesto) nessuna differenza?

+1

Forse quel collegamento ti aiuterà con il contesto di sola riflessione: http://msdn.microsoft.com/en-us/library/ms172331.aspx – rpeshkov

risposta

8

C'è una sottile ma significativa differenza tra "nel contesto di riflessione" e "il contesto di sola riflessione". Il "riflesso unico contesto" si riferisce a qualcosa di molto specifico:

È un modo per caricare un gruppo per il solo esame e ha il vantaggio di non richiedere alcun assembly dipendenti essere caricato o addirittura per essere presente.

Poiché sembra che tu abbia tutte le intenzioni di eseguire parte del codice che stai riflettendo, il contesto di sola riflessione potrebbe essere di uso limitato per te.

+0

che è stato bello sapere. Rimarrò a 'DefaultValue' quindi. La classe 'ParameterInfo' è abbastanza fuorviante. È giunto il momento di fare un'altra domanda sulla differenza tra 'IsOptional' e' HasDefaultValue' – nawfal

+3

Quindi, perché non dovresti usare 'RawDefaultValue' se non sei nel contesto di sola riflessione? – svick

+0

@svick nel mio caso, solo il contesto di esecuzione contava, e ho questa politica di implementare le cose minime a meno che non sia richiesto :) Anche 'RawDefaultValue' ha senso. Gentilmente tagga il mio nome, altrimenti non mi viene notificato. – nawfal