2012-11-30 8 views
10

Mi piacerebbe avere qualcosa di simile alla proprietà prototipo di javascript in C#.
L'idea è di estendere un'istanza di una classe come si fa in javascript.
La cosa più vicina che ho trovato è stata l'utilizzo di ExpandoObject, ma non è possibile inizializzarlo con un oggetto esistente.
Un altro problema è che è possibile recuperare l'oggetto originale da ExpandoObject.Come estendere un oggetto esistente in C# 4.0 usando le dinamiche

Ecco quello che voglio fare

var originalObject = new Person(); 
originalObject.name = "Will"; 
var extendedObject = new ExpandoObject(); 
extendedObject.lastName = "Smith"; 

//do something 

originalObject = (Person) extendedObject; 
+1

Sembra che si vogliano combinare riferimenti tipizzati staticamente e dinamicamente. Non puoi farlo. –

+0

correlati https://weblog.west-wind.com/posts/2012/Feb/08/Creating-a-dynamic-extensible-C-Expando-Object –

risposta

17

È possibile in parte risolvere il problema utilizzando qualcosa di simile:

public static class DynamicExtensions 
{ 
    public static dynamic ToDynamic(this object value) 
    { 
     IDictionary<string, object> expando = new ExpandoObject(); 

     foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(value.GetType())) 
      expando.Add(property.Name, property.GetValue(value)); 

     return expando as ExpandoObject; 
    } 
} 

Ma non sono in grado di copiare i metodi per la nuova ExpandoObject

Problemi correlati