2013-04-24 29 views
9

Jest to kontynuacja pytanie How do I get default values of optional parameters?Różnica między ParameterInfo.DefaultValue i ParameterInfo.RawDefaultValue

Od documentation, DefaultValue:

Pobiera wartość wskazującą wartość domyślną, jeśli parametr ma wartość domyślną.

Ta właściwość jest używana tylko w kontekście wykonania. W kontekście tylko do refleksów należy użyć właściwości RawDefaultValue.

Wartość domyślna jest używana, gdy rzeczywistej wartości nie określono w wywołaniu metody . Parametr może mieć wartość domyślną, która jest pusta. Ten numer różni się od przypadku, w którym wartość domyślna nie jest zdefiniowana.

Od documentation, RawDefaultValue:

Pobiera wartość wskazującą wartość domyślną, jeśli parametr ma wartość domyślną.

Ta właściwość może być używana zarówno w kontekście wykonywania, jak iw kontekście tylko do refleksji.

Wartość domyślna jest używana, gdy rzeczywistej wartości nie określono w wywołaniu metody . Parametr może mieć wartość domyślną, która jest pusta. Ten numer różni się od przypadku, w którym wartość domyślna nie jest zdefiniowana.

Dokumentacja jest bardzo podobna, z wyjątkiem tej, która dotyczy kontekstu refleksji, a inne nie. Jaka to różnica? Kiedy w ogóle jest używane w ogóle bez odbicia? Chodzi mi o to, jak uzyskać wartość domyślną bez refleksji? Czy czegoś brakuje?

Aktualizacja

Stworzyłem dwa przeciążeń tak:

public void Required(string value) 
{ 

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

} 

testowałem z:

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! 

Więc jaka jest różnica biorąc pod uwagę, że moje pokazy testowe (wszystko w świetle odbitym kontekst) bez żadnej różnicy?

+1

Być może ten link pomoże ci w kontekście wyłącznie refleksyjnym: http://msdn.microsoft.com/en-us/library/ms172331.aspx – rpeshkov

Odpowiedz

8

Istnieje subtelna, ale znacząca różnica między "w kontekście refleksji" i "kontekstem tylko do odbicia". „Jedynym odbicie kontekst” odnosi się do czegoś bardzo konkretnego:

Jest to sposób, aby załadować zestawu tylko za badanie i ma wyraźną przewagę, że nie wymaga żadnych zespołów zależnych się załadowany, a nawet być obecny.

Ponieważ wydaje się, że masz zamiar wykonać część kodu, który odzwierciedlasz, kontekst oparty tylko na refleksie byłby dla ciebie ograniczony.

+0

, co było miło wiedzieć. W takim razie trzymam się 'DefaultValue'. Klasa 'ParameterInfo' jest dość myląca. Czas, bym zadał kolejne pytanie na temat różnicy między 'IsOptional' i' HasDefaultValue' – nawfal

+3

Dlaczego więc nie używałbyś 'RawDefaultValue', jeśli nie jesteś w kontekście refleksyjnym? – svick

+0

@svick w moim przypadku, tylko kontekst wykonania ma znaczenie i mam tę zasadę implementacji minimum rzeczy, chyba że jest to wymagane :) 'RawDefaultValue' ma również sens. Prosimy o oznaczenie mojego imienia, inaczej nie otrzymam powiadomienia. – nawfal