Как расширить существующий объект в С# 4.0, используя динамику

Я хотел бы иметь что-то похожее на свойство prototype javascript в c #.
Идея состоит в том, чтобы расширить экземпляр класса, как вы делаете в javascript.
Самым близким, что я нашел, было использование ExpandoObject, но вы не можете инициализировать его с существующим объектом.
Другая проблема заключается в том, что вы можете получить исходный объект из ExpandoObject.

Вот что я хочу сделать:

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

//do something

originalObject = (Person) extendedObject;

Ответ 1

Вы можете частично решить проблему, используя что-то вроде:

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

Но вы не можете скопировать методы в новый ExpandoObject