2012-11-30 9 views
10

Chciałbym mieć coś podobnego do właściwości prototype javascript w C#.
Chodzi o to, aby rozszerzyć instancję klasy tak, jak robisz to w javascript.
Najbliższą rzeczą, jaką znalazłem, było użycie obiektu ExpandoObject, ale nie można go zainicjować za pomocą istniejącego obiektu.
Kolejnym problemem jest to, że możesz odzyskać oryginalny obiekt z ExpandoObject.Jak przedłużyć istniejący obiekt w C# 4.0 używając dynamiki

Oto co chcę zrobić

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

//do something 

originalObject = (Person) extendedObject; 
+1

Wygląda na to, że chcesz mieszać referencje statycznie i dynamicznie pisane. Nie możesz tego zrobić. –

+0

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

Odpowiedz

17

można częściowo rozwiązać problem za pomocą czegoś takiego:

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; 
    } 
} 

ale nie jesteś w stanie skopiować metody do nowej ExpandoObject

Powiązane problemy