2016-12-07 5 views
1

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

Dynamically Add C# Properties at Runtime

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

Что reaaly нужно сделать, это написать универсальный метод, который принимает объект типа 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; 
} 

ответ

4

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

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 
+1

Большой answe Спасибо. –

Смежные вопросы