Mit .NET 4, C#
Sagen wir, ich habe Unterricht Info
die die CustomTypeDescriptor
. Eine Instanz der Klasse Info
hat ein Wörterbuch von <string, object>
Paare, die zur Laufzeit geladen werden.
Ich möchte in der Lage sein, die Wörterbuchschlüssel als Eigenschaften freizugeben (so dass jede Instanz von Info
unterschiedliche Eigenschaften hat). Die Werte der Eigenschaften sollten die entsprechenden Werte des Wörterbuchs sein.
Ich bin dazu übergegangen, Eigenschaften freizulegen:
public override PropertyDescriptorCollection GetProperties()
{
var orig = base.GetProperties();
var newProps = dictionary.Select( kvp =>
TypeDescriptor.CreateProperty(
this.GetType(),
kvp.key,
typeof(string)));
return new PropertyDescriptorCollection(
orig.Cast<PropertyDescriptor>()
.Concat(newProps)
.ToArray());
}
Das Problem ist, wie erhalte ich ihre Werte?
var info = new Info(new Dictionary<string, object>{{"some_property", 5}};
var prop = TypeDescriptor.GetProperties(i_info)["some_property"];
var val = prop.GetValue(i_info); //should return 5
Die einzige Möglichkeit, die ich gefunden habe, um die Kontrolle zu erhalten, wenn prop.GetValue()
aufgerufen wird, war die Aufhebung von GetPropertyOwner(PropertyDescriptor pd)
aber so wie ich es verstehe, erwartet es, dass ich die Instanz eines anderen Typ die eine passende reale (kompilierte) Eigenschaft hat.
Ich möchte in der Lage sein, die eigentliche Implementierung der Eigenschaft selbst zu schreiben (für dieses Beispiel den Wert im Wörterbuch zurückgeben, dessen Schlüssel mit dem Eigenschaftsnamen übereinstimmt).
Ist dies möglich?