Массив динамического |ExpandoObject |с сжатым синтаксисом инициализации - PullRequest
9 голосов
/ 26 января 2011

Я пытаюсь использовать DynamicObject в c #, и мне нужен массив динамических:

var d = new dynamic[];

, который работает нормально.

РЕДАКТИРОВАТЬ: см. ExpandoObject ниже.

Но мне также нравится заполнять этот массив некоторыми данными с помощью этого сжатого инициализирующего нового синтаксиса:

var d = new dynamic[] { 
  new {
   Name = "Some",
   Number = 1010
  },
  new {
   Name = "Other",
   Number = 2010
  }
 }

Но в этом случае все объекты получают нединамический тип «объект», и цикл через элементы выдаст мне исключение:

foreach (dynamic item in d)
{
  @item.Name
  @item.Number
}

Ошибка: «объект» не содержит определения для «имени». Я предполагаю, что просто инициализирую элементы массива неправильно. Как добавить динамические объекты вместо этого?

РЕДАКТИРОВАТЬ: Новый контент:

Я понимаю, что у "dynamic" нет возможности динамически добавлять свойства.

Лучше использовать ExpandoObject, который выставляет все элементы во внутреннем словаре в качестве свойств. Но, к сожалению, ExpandoObject, похоже, не поддерживает этот красивый сжатый синтаксис create, и компилятор жалуется:

var d = new ExpandoObject[]{
new ExpandoObject(){
    Name="Nnn",
    Number=1080
    }
}

Так что ответ может быть просто: это невозможно.

Ответы [ 3 ]

7 голосов
/ 26 января 2011

Надеюсь, вам не очень нужна динамика

class Program
{
    static void Main(string[] args)
    {
        var d = new[]
                    {
                        new
                            {
                                Name = "Some",
                                Number = 1010
                            },
                        new
                            {
                                Name = "Other",
                                Number = 2010
                            }
                    };
        foreach (var item in d)
        {
            string s = @item.Name;
            int n = @item.Number;
            Console.WriteLine("{0} {1}", s, n);
        }
    }
}
5 голосов
/ 14 сентября 2011

Я немного опоздал, но вот что я нашел по этому поводу:

, если я не могу инициализировать ExpandoObject, как насчет инициализации его динамическим типом?

, поэтому я сделалследующий метод расширения

    public static ExpandoObject CreateExpando(this object item)
    {

        var dictionary = new ExpandoObject() as IDictionary<string, object>;
        foreach (var propertyInfo in item.GetType().GetProperties())
        {
            dictionary.Add(propertyInfo.Name, propertyInfo.GetValue(item, null));
        }
        return (ExpandoObject)dictionary;
    }

Я знаю, что это далеко от идеала, но это лучшее, чего я мог достичь на данный момент, это работает так:

var myExpandoObject = new { Name="Alex", Age=30}.CreateExpando();
1 голос
/ 21 апреля 2011

Платформа с открытым исходным кодом Impromptu-Interface имеет сжатый синтаксис инициализации , который работает с ExpandoObject.

dynamic @new = Builder.New<ExpandoObject>();

var d = @new.List( 
  @new.Expando(
   Name:"Some",
   Number: 1010
  ),
  @new.Expando(
   Name:"Other",
   Number: 2010
  )
 );
...