2013-05-01 17 views
5

Chciałbym przypisać ciąg właściwości poniżej atrybutu.Jak przypisać właściwość do atrybutu

[ExtractKeyAttribute(**"Extraction"**)] 

public class Extract 
{ 
    .... 
} 

, więc ekstrakcja jest moim ciągiem, ale nie chcę tam twardego kodu. Wszelkie sugestie dotyczące lepszego sposobu przypisania

+0

Czy umieścisz atrybut na samej nieruchomości? –

+0

Jak nazwać co? Wygląda na to, że masz właściwość, która określa, co powinno zostać wyodrębnione jako klucz, prawda? Być może więc, jeśli masz atrybut 'KeyName' i umieścisz go w tej właściwości, to cokolwiek robi wyodrębnianie może szukać twojego atrybutu' KeyName' we właściwościach klasy, a następnie pobierz nazwę klucza z tej właściwości, która ma ten atrybut. Czy to ma sens? –

+0

@ChrisNielsen Tak, że ma sens partner ... Podałem ciąg const i przypisuję atrybut. – user1990395

Odpowiedz

13

Nie możesz tego zrobić.

Wartości atrybutów musi być być wyrażeniami stałymi. Wartości są pieczone w skompilowanym kodzie. Jeśli nie chcesz używać stałego wyrażenia, nie możesz użyć atrybutu ... i prawdopodobnie nie powinieneś. Może to oznaczać, że używasz atrybutów, gdy powinieneś używać innego podejścia.

Być może zechcesz przeczytać wpis na blogu Eric Lippert pod numerem properties vs attributes.

Oczywiście nie trzeba tu używać literału. Mogłeś:

[ExtractKey(ExtractionKeys.Extraction)] 
... 


public static class ExtractionKeys 
{ 
    public const string Extraction = "Extraction"; 
} 

... ale nadal jest to stała czasu kompilacji.

+0

Dziękuję za szybką odpowiedź i pozwól mi sprawdzić przez link – user1990395

+0

@ user1990395: Obawiam się, że nie wiem co masz na myśli. Wyjaśnij swój komentarz i być może będę w stanie odpowiedzieć. –

+0

Tylko dla kompletności, inną popularną opcją (-ish) unikania twardych literałów jest podklasy atrybut tak, że podklasa może rozwiązać rzeczywistą wartość w czasie wykonywania w zwykłym kodzie. –

0

W swoich komentarzach mówisz, że masz wszystkie (łańcuchowe) wartości w klasie statycznej. Czy twoja klasa statyczna jest klasą z właściwościami tylko do odczytu? Mam na myśli, czy wartości się zmieniają? Jeśli nie, zastąp niektóre z tych właściwości w swojej klasie statycznej wartościami stałych stałych. U możesz użyć tych wartości, aby ustawić swój atrybut.

Więc ...

static class MyClass 
{ 
    public string MyValue {get;} 
} 

staną:

static class MyClass 
{ 
    public const string MyValue= "MyValue"; 
} 

Teraz atrybutu można ustawić w następujący sposób:

[ExtractKey(MyClass.MyValue)] 
0

Jeśli chcesz zmodyfikować właściwość twoich atrybut podczas działania, możesz to zrobić za pomocą tego kodu:

ExtractKeyAttribute myAttribute = typeof(Extract).GetCustomAttributes(typeof(ExtractKeyAttribute), false)[0] as ExtractKeyAttribute; 
myAttribute.MyValue = "MyRunTimeValue"; 
Powiązane problemy