2009-02-19 16 views

Odpowiedz

2

Edytuj: proszę wyjaśnić, czy mówisz o c# attributes lub członkach swojej klasy?

Jedynym sposobem dodania atrybutów C# jest wygenerowanie zupełnie nowej klasy z dodatkowymi atrybutami, skompilowanie i załadowanie nowego zespołu do istniejącej domeny aplikacji.

+0

oraz klasy, oznacza on zupełnie nowy typ, nie tylko inne wystąpienie tej samej klasy. –

+0

@Joel całkiem słusznie, widzę, że może to być trochę niejednoznaczne. Dzięki –

1

Użyj tablicy do przechowywania atrybutów.

Jeśli potrzebujesz większej elastyczności czasu pracy, możesz wypróbować Ruby lub inny język interpretowany.

+0

s/interpretowane/dynamiczne /. Ruby, PHP i Python są dynamiczne. C#, Java i VB są statyczne. – strager

+0

@bill Myślę, że masz na myśli dynamiczny język ... –

+0

Oczywiście - dobry punkt. Każdy język można skompilować, a każdy język można zinterpretować. Dziwny zbieg okoliczności, że Ruby, PHP i Python są generalnie interpretowane, a C#, Java i VB są kompilowane ... –

0

Atrybuty są częścią metadanych danego typu i dlatego są zakodowane na sztywno w złożonym zestawie (dlatego też dozwolone są tylko niektóre typy prymitywne, a nie arbitralne dane w atrybutach).

Konsekwencją jest to, że nie można dodawać żadnych atrybutów do typu w środowisku wykonawczym. Ale są różne alternatywne techniki. Możesz użyć prostych słowników lub czegoś bardziej potężnego, takiego jak attached dependency properties.

9

Co trzeba zobaczyć atrybuty? Jeśli jest to takie rzeczy jak wiązania danych itp TypeDescriptor powinno działać:

TypeDescriptor.AddAttributes(type, attribs); 
TypeDescriptor.AddAttributes(instance, attribs); 

Wpływa to tylko System.ComponentModel wykorzystanie (bez bezpośredniego odbicia), ale jest to dość często - na przykład, można skojarzyć TypeConverter pośrednictwem wyżej.

Jeśli przez "atrybuty" rozumiesz "właściwości", to (znowu, jeśli chodzi o wiązanie danych), TypeDescriptor ma również potencjał, ale nie jest to trywialne; musisz albo zaimplementować ICustomTypeDescriptor na obiekcie, albo napisać CustomTypeDescriptor dla tego typu - i w obu przypadkach musisz napisać własną implementację PropertyDescriptor (często rozmawiającą ze słownikiem dla każdej instancji itp.). Spowoduje to użycie wszystkiego, co używa:

// only works if you use TypeDescriptionProvider 
PropertyDescriptorCollection typeProps = TypeDescriptor.GetProperties(type); 
// works via TypeDescriptionProvider or ICustomTypeDescriptor 
PropertyDescriptorCollection objProps = TypeDescriptor.GetProperties(obj); 

Ponownie obejmuje to szeroki zakres powiązań danych i podobnych scenariuszy. Na przykład, see here - to jednak wcale nie jest banalne. Przykład użycia (z linkiem) dodaje dwie właściwości w czasie wykonywania:

Bag.AddProperty<int>("TestProp", new DefaultValueAttribute(5)); 
Bag.AddProperty<string>("Name"); 
Powiązane problemy