Secondo questa: Adding properties and methods to an ExpandoObject, dynamically!,
... è possibile utilizzare un oggetto expando come titolare valore, e gettalo via a un IDictionary < stringa, oggetto > quando si desidera aggiungere le proprietà denominate in modo dinamico.
Esempio
dynamic myobject = new ExpandoObject();
IDictionary<string, object> myUnderlyingObject = myobject;
myUnderlyingObject.Add("IsDynamic", true); // Adding dynamically named property
Console.WriteLine(myobject.IsDynamic); // Accessing the property the usual way
Th è testato e stamperà "true" sullo schermo della console.
Naturalmente, nel tuo caso, dove l'oggetto sottostante deve ereditare da un'altra classe, questo esempio viene fornito solo per darti un'idea per una potenziale implementazione personalizzata.
Forse include un oggetto expando nell'implementazione di classe e il reindirizzamento delle chiamate a tryget e tryset all'istanza dell'oggetto expando nella classe?
UPDATE
se la classe di base deriva da DynamicObject (significa che è possibile ignorare tutto TrySet/Get/metodi Richiamare), allora, si potrebbe anche utilizzare un dizionario internamente. Nel tentativo get/set esegue l'override di qualsiasi evento che si attiva e delegare l'impostazione al dizionario interno.
Per aggiungere una nuova proprietà (o rimuoverne una esistente), è possibile ignorare TryInvoke. Quando il nome del mothod è, ad esempio, "AddProperty" e c'è un argomento di tipo string, si dovrebbe aggiungere un nuovo elemento nel dizionario con il nome dell'argomento. Allo stesso modo si definirà dinamicamente una "RemoveProperty" ecc. Non è nemmeno necessario un expando object.
class MyBaseClass: DynamicObject
{
// usefull functionality
}
class MyClass: MyBaseClass
{
Dictionary<string, object> dynamicProperties = new Dictionary<string, object>();
override bool TryGetMember(...)
{
// read the value of the requested property from the dictionary
// fire any events and return
}
override bool TrySetMember(...)
{
// set the value of the requested property to the dictionary
// if the property does not exist,
// add it to the dictionary (compile time dynamic property naming)
// fire any events
}
override bool TryInvoke(...)
{
// check what method is requested to be invoked
// is it "AddProperty"??
// if yes, check if the first argument is a string
// if yes, add a new property to the dictionary
// with the name given in the first argument (runtime dynamic property naming)
// if there is also a second argument of type object,
// set the new property's value to that object.
// if the method to be invoked is "RemoveProperty"
// and the first argument is a string,
// remove from the Dictionary the property
// with the name given in the first argument.
// fire any events
}
}
// USAGE
static class Program
{
public static void Main()
{
dynamic myObject = new MyClass();
myObject.FirstName = "John"; // compile time naming - TrySetMember
Console.WriteLine(myObject.FirstName); // TryGetMember
myObject.AddProperty("Salary"); // runtime naming (try invoke "AddProperty" with argument "Salary")
myObject.Salary = 35000m;
Console.WriteLine(myObject.Salary); // TryGetMember
myObject.AddProperty("DateOfBirth", new DateTime(1980,23,11)); // runtime naming (try invoke "AddProperty" with fisrt argument "DateOfBirth" and second argument the desired value)
Console.WriteLine(myObject.DateOfBirth); // TryGetMember
myObject.RemoveProperty("FirstName"); // runtime naming (try invoke "RemoveProperty" with argument "FirstName")
Console.WriteLine(myObject.FirstName); // Should print out empty string (or throw, depending on the desired bahavior) because the "FirstName" property has been removed from the internal dictionary.
}
}
Naturalmente, come ho già detto, che avrebbe funzionato solo se la classe di base deriva da DynamicObject.
Ancora non capisci PERCHE 'dynamic e ExpandoObject sono entrati in .NET. Il motivo era esatto opposto a quello che volevi. ExpandoObject usa ancora Dictionary, beh IS Dictionary. Il compilatore traduce tutte le chiamate di "proprietà" solo nel dizionario [NameOfProperty]. Questo rende il codice molto più bello. Ma questo è tutto, il suo unico codice-zucchero. Quello che vuoi può essere acquisito con il dizionario anche senza alcuna digitazione dinamica. –
Euphoric
E gli eventi che devono essere generati quando vengono impostati gli elementi del dizionario? – sbenderli
possibile duplicato di [Aggiunta dinamica di membri a un oggetto dinamico] (http: // stackoverflow.it/questions/2079870/dynamically-adding-members-to-a-dynamic-object) – nawfal