Динамическое добавление динамических свойств во время выполнения

Я хочу добавить динамические свойства и динамически к объектам. Хотя здесь дан ответ на аналогичный вопрос, в котором используется ExpandoObject:

Динамическое добавление свойств C# во время выполнения

Хотя приведенный выше ответ динамически добавляет свойства, он не удовлетворяет мою потребность. Я хочу иметь возможность добавлять переменные свойства.

Что я действительно хочу сделать, так это написать универсальный метод, который принимает объект типа T и возвращает расширенный объект со всеми полями этого объекта, а также с некоторыми другими:

public static ExpandoObject Extend<T>(this T obj)
{
    ExpandoObject eo = new ExpandoObject();
    PropertyInfo[] pinfo = typeof(T).GetProperties();
    foreach(PropertyInfo p in pinfo)
    {
        //now in here I want to get the fields and properties of the obj
        //and add it to the return value
        //p.Name would be the eo.property name
        //and its value would be p.GetValue(obj);
    }

    eo.SomeExtension = SomeValue;
    return eo;
} 

person Ashkan Mobayen Khiabani    schedule 07.12.2016    source источник


Ответы (1)


Вы можете сделать что-то вроде этого:

public static ExpandoObject Extend<T>(this T obj)
{
    dynamic eo = new ExpandoObject();
    var props = eo as IDictionary<string, object>;

    PropertyInfo[] pinfo = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
    foreach (PropertyInfo p in pinfo)
        props.Add(p.Name, p.GetValue(obj));

    //If you need to add some property known at compile time
    //you can do it like this:
    eo.SomeExtension = "Some Value";

    return eo;
}

Это позволяет вам сделать это:

var p = new { Prop1 = "value 1", Prop2 = 123 };
dynamic obj = p.Extend();

Console.WriteLine(obj.Prop1);           // Value 1
Console.WriteLine(obj.Prop2);           // 123
Console.WriteLine(obj.SomeExtension);   // Some Value
person Arturo Menchaca    schedule 07.12.2016
comment
Отличный ответ Спасибо. - person Ashkan Mobayen Khiabani; 07.12.2016