Другой вариант - использовать ExpandoObject
класс , если вы хотите напрямую выставить член Data
, как в вашем примере. Это делает код проще, если вам не нужно определять конкретные операции, которые потребуют наследования DynamicObject
.
public class Foo
{
public dynamic Data = new ExpandoObject();
public Foo(params object[] args)
{
var dataDict = (IDictionary<string, object>)Data;
foreach (var obj in args)
{
dataDict.Add(obj.ToString(), "..");
}
}
}
Использование:
var foo = new Foo("a", "b", "c");
Console.WriteLine(foo.Data.a);
((IDictionary<string, object>)foo.Data).Add("d", "!");
foreach (var item in foo.Data)
{
Console.WriteLine("{0} : {1}", item.Key, item.Value);
}
Обратите внимание, что я произвел приведение к словарю и добавил «d», хотя я мог бы также назначить его напрямую: foo.Data.d = "!"
. Единственная разница в том, что вы можете не знать заранее, какие имена полей у вас есть, и первый пример позволяет вам настроить ExpandoObject
на основе динамического ввода, тогда как последний полезен, когда вы уже знаете, какое имя поля использовать.