2009-08-01 19 views
37

Mam anonimową klasę:Czy mogę używać atrybutów z klasami anonimowymi?

var someAnonymousClass = new 
{ 
    SomeInt = 25, 
    SomeString = "Hello anonymous Classes!", 
    SomeDate = DateTime.Now 
}; 

czy jest tak, aby dołączyć do tej klasy atrybutów? Odbicie, inne? Naprawdę miałem nadzieję na coś takiego:

var someAnonymousClass = new 
{ 
    [MyAttribute()] 
    SomeInt = 25, 
    SomeString = "Hello anonymous Classes!", 
    SomeDate = DateTime.Now 
}; 

Odpowiedz

45

Tworzysz tutaj coś, co nazywa się typem anonimowym, a nie dynamicznym.

Niestety nie ma sposobu, aby osiągnąć to, co próbujesz zrobić. Typy anonimowe mają być bardzo prostym rodzajem niezmiennym, składającym się z par nazwa/wartość.

Tylko wersja anonimowa typu C# umożliwia dostosowanie zestawu par nazwa/wartość do typu bazowego. Nic więcej. VB.Net umożliwia nieco więcej personalizacji, ponieważ pary mogą być zmienne lub niezmienne. Nie zezwala się jednak na rozszerzanie typu za pomocą atrybutów.

Jeśli chcesz dodać atrybuty, musisz utworzyć pełny typ.

EDYCJA OP zapytał, czy można dodać atrybuty za pomocą odbicia.

Nie można tego zrobić. Odbicie jest sposobem sprawdzania metadanych, które nie powodują mutacji. Dlatego nie można go używać do dodawania atrybutów.

Ponadto, należy definiować definicje w złożeniu i ogólnie rzecz biorąc, są niezmienne i nie można ich zmutować w czasie wykonywania [1]. Obejmuje to dodanie atrybutów do metody. Dlatego też nie można tu zastosować innych technologii podobnych do refleksji.

[1] Jedynym wyjątkiem od tego jest działanie ENC

9

Przede wszystkim jest to typ anonimowy. Słowo "dynamiczny" może sprawić, że ludzie pomyślą, że mówimy o klasie dynamicznej, która nie jest tą, która implementuje dynamiczną semantykę klasy C# 4.0.

Po drugie, nie, nie jesteś w stanie zrobić, o co prosisz.

Jeśli chcesz określić atrybuty dla swoich właściwości, powrócisz do nazwanego typu, tj. normalna klasa lub struktura.

+0

Masz rację, chodzi mi o typ Anona, dziękuję za wyjaśnienia. – will

7

Możliwe jest dodanie atrybutów dla anonimowego przykład używając TypeDescriptor.AddAttributes. Następnie uzyskasz dostęp do atrybutów za pomocą TypeDescriptor.GetAttributes.

Nie spowoduje to dodania ich do instancji typu typu dla obiektu. Może to nie być przydatne w twoim przypadku, jeśli nie kontrolujesz kodu, który pobiera i stosuje atrybuty.

+0

Uwaga, to dodaje atrybuty na poziomie klasy, a NIE na atrybuty poziomu właściwości wymienione w przykładzie w pytaniu. – DeepSpace101

Powiązane problemy