Jako klasa jednostek, chcę dodać atrybuty w czasie wykonywania, jak mam to zrobić?C#: Jak dodać atrybuty do obiektu w czasie wykonywania?
Odpowiedz
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.
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.
s/interpretowane/dynamiczne /. Ruby, PHP i Python są dynamiczne. C#, Java i VB są statyczne. – strager
@bill Myślę, że masz na myśli dynamiczny język ... –
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 ... –
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.
Zobacz Dynamic Language Runtime. Możesz również rozważyć dynamiczny język, taki jak IronRuby lub IronPython.
Jaki problut próbujesz rozwiązać?
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");
pójdę z PostSharp, bardzo elegancki AOP framework (lub Polityka wtrysk).
PostSharp allows you to inject custom attributes.
Wpis blogu, do którego odnosi się post, zawiera kod, który można pobrać, aby osiągnąć swój cel.
Ten post to odpowiedział mi:
- 1. Znajdź odniesienia do obiektu w czasie wykonywania
- 2. C# WPF dodać kontrolę do okna głównego w czasie wykonywania
- 3. Objective-C: Jak zmienić klasę obiektu w czasie wykonywania?
- 4. Jak dodać widok dynamiczny do elementu ListView w czasie wykonywania?
- 5. Jak dodać składniki do JPanel w czasie wykonywania
- 6. Modyfikowanie modelu struktury obiektu w czasie wykonywania
- 7. Skompiluj rozszerzenie kodu C# w czasie wykonywania
- 8. Jak mogę dodać właściwości do obiektu w środowisku wykonawczym?
- 9. Jak dodać element paska czynności w czasie wykonywania?
- 10. C++ Przypisywanie wartości stałej w czasie wykonywania?
- 11. Pętla przez wszystkie właściwości obiektu w czasie wykonywania
- 12. Jak zmienić lokalizację strony w czasie wykonywania
- 13. Jak sprawdzić typ zmiennej w C w czasie wykonywania?
- 14. Narzędzia Java do łączenia wykonywania w czasie wykonywania z pokryciem
- 15. Awaria OCMock w czasie wykonywania
- 16. Konwersja data- * atrybuty do obiektu
- 17. Jak pozbyć się LD_LIBRARY_PATH w czasie wykonywania?
- 18. Zmiana rozmiaru THREE.CubeGeometry w czasie wykonywania
- 19. Jak dodać atrybuty danych do pliku Html.BeginForm
- 20. Używanie pamięci C# app w czasie wykonywania ankiety?
- 21. Jak dodać atrybuty do właściwości klasy bazowej
- 22. Dodawanie obramowania do grupy w czasie wykonywania w flex
- 23. Ładowanie XAML w czasie wykonywania?
- 24. Jak dostosować poziomy log4j w czasie wykonywania?
- 25. Jak zmienić rozszerzenie pliku w czasie wykonywania
- 26. W jaki sposób GDB ocenia wyrażenia C++ w czasie wykonywania
- 27. Jak wrócić do wielu języków w Django w czasie wykonywania?
- 28. Jak uzyskać typ ogólny w czasie wykonywania?
- 29. Znajdź div w czasie wykonywania po stronie serwera w C#
- 30. Jak zablokować orientację w czasie wykonywania
oraz klasy, oznacza on zupełnie nowy typ, nie tylko inne wystąpienie tej samej klasy. –
@Joel całkiem słusznie, widzę, że może to być trochę niejednoznaczne. Dzięki –