2010-04-28 7 views
22

Ilekroć próbuję ustawić domyślną wartość opcjonalny parametr do czegoś w pliku zasobów, pojawia się błąd kompilacji czasowyUstawienie wartości domyślnej C# opcjonalny parametr

Domyślna wartość parametru dla ' komunikat "musi być stałą czasu kompilacji.

Czy jest jakiś sposób, aby zmienić sposób działania plików zasobów, aby było to możliwe?

public void ValidationError(string fieldName, 
          string message = ValidationMessages.ContactNotFound) 

W tym przypadku ValidationMessages jest plikiem zasobów.

+0

@Joel: Dzięki! Selekcjoner flag był trochę podły i nie zdawałem sobie sprawy, że wygrałem. :-) – Jaxidian

Odpowiedz

12

Nie, nie będziesz w stanie sprawić, aby zasób działał bezpośrednio w ustawieniach domyślnych. Należy ustawić wartość domyślną na coś podobnego, a następnie wykonać wyszukiwanie zasobów, gdy parametr ma domyślną wartość w treści metody.

+0

Tego właśnie się bałem. Bardzo podoba mi się wygoda programowania w czasie, informując programistów, jaki będzie łańcuch znaków: http://jaxidian.org/optparam.jpg Rozumiem, że to o co proszę (kompilacja pliku zasobów) zabija część przyczyny istnieje, ale używam go nie dla lokalizacji i dynamicznych zmian, ale jako wspólny magazyn dla ponownie używanych ciągów. – Jaxidian

+0

Ale oczywiście! Dziękuję za tę odpowiedź –

+0

, ale niektóre wartości domyślne nie są nullable jak "int". Jak sobie z tym radzisz? –

13

Jedną z opcji jest, aby wartość domyślną null a następnie wypełnić odpowiednio, że:

public void ValidationError(string fieldName, string message = null) 
{ 
    string realMessage = message ?? ValidationMessages.ContactNotFound; 
    ... 
} 

Oczywiście, działa to tylko jeśli nie chcesz, aby null jako prawdziwej wartości.

Inną potencjalną opcją byłby etap wstępnej kompilacji, który utworzyłby plik zawierający ciągi const oparte na zasobach; możesz wtedy odwołać się do tych stałych. Byłoby jednak dość niezręcznie.

+0

Tego się bałem. Bardzo podoba mi się wygoda programowania w czasie, informując programistów, jaki będzie łańcuch znaków: http://jaxidian.org/optparam.jpg Rozumiem, że to o co proszę (kompilacja pliku zasobów) zabija część przyczyny istnieje, ale używam go nie dla lokalizacji i dynamicznych zmian, ale jako wspólny magazyn dla ponownie używanych ciągów. – Jaxidian

11

Inną opcją jest, aby podzielić swoją metodę na dwa, i mają jeden przeciążenie wywołać drugą, tak jak poniżej:

public void ValidationError(string fieldName) 
{ 
    ValidationError(fieldName, ValidationMessages.ContactNotFound); 
} 

public void ValidationError(string fieldName, string message) 
{ 
    ... 
} 

ten sposób umożliwia również przekazać null jako wartość message w przypadku, gdy jest również poprawną wartość tego parametru.