2014-02-04 3 views
0

Я пытался создавать объекты во время выполнения. У нас есть инфраструктура .net, предоставляющая такие классы, как DynamicObject и ExpandoObject. Возможно ли создать динамический объект, подобный этомуДинамическое добавление свойств объекту

dynamic obj = new expandoObject(); 
obj["propName1"] = "name"; //string type 
obj["propName2"] = 24; //int type 

Я не знаю названия свойств до времени выполнения. Можно ли так поступать?

+1

не словарь достаточно? – BlackBear

+1

Если вы не знаете имена свойств до выполнения, как вы собираетесь читать значения после этого? Как @BlackBear говорит, почему вы не можете использовать словарь? –

+0

Посмотрите здесь: http://stackoverflow.com/questions/14420427/add-property-to-poco-class-at-runtime –

ответ

4

Ну, две вещи.

Во-первых, да, вы можете значения вещи в ExpandoObject объекта, используя «имена свойств», содержащихся в строках, так как он реализует IDictionary<string, object>, так что вы можете сделать это следующим образом:

void Main() 
{ 
    dynamic obj = new ExpandoObject(); 
    var dict = (IDictionary<string, object>)obj; 
    dict["propName1"] = "test"; 
    dict["propName2"] = 24; 

    Debug.WriteLine("propName1=" + (object)obj.propName1); 
    Debug.WriteLine("propName2=" + (object)obj.propName2); 
} 

Обратите внимание, как я используйте синтаксис свойства для получения там значений. К сожалению, dynamic похож на вирус и распространяется, и Debug.WriteLine не очень-то радуется dynamic значениям, поэтому мне пришлось бросить на object.

Однако, это второе, если вы не знаете имена свойств до выполнения, эти две последние строки не будут отображаться нигде в вашей программе. Единственный способ получить значения - это снова привести его в словарь.

Так вы лучше просто использовать словарь, чтобы начать с:

void Main() 
{ 
    var obj = new Dictionary<string, object>(); 
    obj["propName1"] = "name"; 
    obj["propName2"] = 24; 

    Debug.WriteLine("propName1=" + obj["propName1"]); 
    Debug.WriteLine("propName2=" + obj["propName2"]); 
} 
+0

Thanks Lasse !! Это работает для меня. – user1176058

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