Dynamische Klasse mit DynamicObject erstellen
- Juli 25th, 2010
- Posted in .NET . CSharp . Development
- Kommentar schreiben
DynamicObject ist eine abstrakte Basisklasse (ab .NET 4.0) zum Angeben von dynamischen Verhalten und stellt diese zur Laufzeit bereit. Erbt man in mit seiner Klasse von der Klasse DynamicObject kann man diese dynamisch gestalten. Durch eine Instanziierung mit den dynamic Operators kann man “Nichtdefinierte” Member seiner implementierten Klasse festlegen und setzen. Die Properties werden erst zu Laufzeit ausgewertet. Folgendes Beispiel soll die verdeutlichen:
Meine BasisKlasse Person erbt von DynamicObject und überschreibt die Methoden TryGetMember und TrySetMember. Zusätzlich definiere ich mir ein Dictionary
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class Person : DynamicObject { Dictionary<string, object> properties = new Dictionary<string, object>(); public override bool TryGetMember(GetMemberBinder binder, out object result) { return properties.TryGetValue(binder.Name, out result); } public override bool TrySetMember(SetMemberBinder binder, object value) { properties[binder.Name] = value; return true; } public Dictionary<string, object> GetProperties() { return properties; } } |
Bei der Verwendung lege ich dann die Eigenschaften fest und gebe diese mit der implementierten Methode GetProperties wieder aus:
1 2 3 4 5 6 7 8 9 10 11 12 | dynamic p = new Person(); p.Vorname = "Mario"; p.Nachname = "Priebe"; p.Alter = 37; p.Internet = "www.biggle.de"; p.EMail = "mp@biggle.de"; foreach (var prop in p.GetProperties()) { Console.WriteLine(prop.Value.ToString()); } |
Nett, oder? Viel Spass am entwickeln : )
Ähnliche Beiträge
Auch wenn Du nichts zu diesem Thema sagen möchtest, bringst du mit einem Klick auf den Like- oder KickButton zum Ausdruck, dass dir dieser Artikel gefällt. Vielen Dank : )




Kennst du ExpandoObject?
http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject.aspx
Ah nice, wenn man keine eigene Semantik benötigt, genau das richtige. Danke für den Tipp!
Hast Du damit schon arbeiten dürfen? An welcher Stelle würde der Einsatz vom ExpandoObject Sinn machen?
Ich persönlich bin kein Freund von dieser ganzen Dynamic-Geschichte. Logischerweise bieten solche Objekte kein Intellisense. Dadurch kann man sich an anderer Stelle schnell mal vertippen und schon hat man den Bug. Wenn ich mal schnell einen Container brauche, nehme ich lieber ein Tuple, ansonsten ziehe ich das gute alte POCO vor.
Laut MSDN macht das ExpandoObject dort Sinn, wo ein bestehendes Objekt erweitert werden muss (daher der Name), also typisches Decorator-Szenario.
Hallo Rainer,
ich sehe das genau so, nur ich versuche dennoch das eine oder andere Scenario zu finden, bei dem dynamic vielleicht doch mal Sinn machen könnte. Mit POCO habe ich bisher noch keine Erfahrung.
POCOs sind ganz einfach Entities oder Container wie z.B.
public struct Person
{
public string FirstName{get;set;}
public string LastNae{get;set;}
public DateTime DateOfBirth{get;set;}
// usw.
}
Ich benutze hier bewusst struct und nicht class um dieser “null ist böse” Diskussion aus dem Weg zu gehen. Ein struct kann nie null sein. ;-)
Übrigens: Wenn du mal ein snnvoles Szenario für Dynamic findest, kannst du ja einen Blogpost darüber machen. Es würde mich auch interessieren. Dein Blog hab ich in die Bookmarks aufgenommen.
Das mach ich gerne : )
Hallo Mario,
ich habe gerade einen Artikel zum Thema gefunden, der interessant sein könnte (hab auch gerade erst angefangen zu lesen):
http://msdn.microsoft.com/en-us/magazine/ff796227.aspx