C # Dynamic расширяет объект - PullRequest
       1

C # Dynamic расширяет объект

4 голосов
/ 19 января 2011

можно ли расширить существующий объект?

у меня есть код

var record = new
{
    id,
    name
};

и список анонимных объектов

var list = new List<object>(){ object1, object2 };

Могу ли я добавитьих позже к объекту?Как что-то вроде

foreach (var o in list)
{
    record.add(o);
}

, что я получу это как результат

var record = new
{
    id,
    name,
    object1,
    object2
};

Ответы [ 4 ]

2 голосов
/ 19 января 2011

Короче, нет. По крайней мере, не с анонимными типами. Здесь есть два подхода; dynamic может дать вам то, что вы хотите, но это сложная комбинация. Кроме этого, подойдет пакет с базовыми свойствами - даже просто Dictionary<string,object>. Единственная разница в том, что:

obj.id

становится

obj["id"]

Однако существует более фундаментальная проблема при попытке объединить список (каждый из которых в значительной степени анонимен) с свойствами за один шаг. Вы можете сделать это для привязки данных через пользовательские модели свойств , но это ... сложно.

1 голос
/ 23 июля 2018

В случае, если кто-то столкнется с этим вопросом в будущем, я недавно опубликовал библиотеку, чтобы сделать именно это.Вы можете найти его на nuget.org - он называется (неудивительно) ObjectExtend.

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

.- установите пакет, убедитесь, что вы импортировали пространство имен с помощью using Rophuine.LINQPad.ObjectExtend;, и теперь вы должны иметь возможность вызывать .Extend для ваших объектов.

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

1 голос
/ 19 января 2011

Что вы можете сделать, это создать расширение класса. Невозможно добавить новые методы во время выполнения, но вы можете сделать что-то вроде этого:

public class OneClass
{
  private List<object> items;
  public List<object> Items { get { return items; } }
  public void AddOne(object item)
  {
    items.Add(item);
  }
}

если вы хотите расширить поведение этого класса, вы можете написать класс расширения. Как это:

public static class OneClassExtensions
{
  public void AddMany(this OneClass self, params object[] items)
  {
    foreach(object item in items)
    {
      self.Items.Add(item);
    }
  }
}

Таким образом, вы можете вызвать этот метод расширения из ваших объектов OneClass:

OneClass obj = new OneClass();
obj.AddOne("hello");
obj.AddMany("Hello", "world"); // Extension method

Есть несколько правил, которым нужно следовать:

  1. Класс расширения должен иметь модификатор «static»
  2. вам нужно поставить префикс "this" перед первым аргументом. Этим аргументом будет сам объект.
  3. Чтобы использовать этот класс расширения в своем коде, вы должны использовать пространство имен, которое содержит этот класс расширения, например `using Some.Namespace.That.Has.An.Extension 'в каждом файле .cs, где вы хотите использовать методы расширения.
0 голосов
/ 19 января 2011

Начиная с .net4, вы можете использовать ExpandoObject для подобных вещей.

Например:

        var objs = new List<ExpandoObject>();

        for (var i = 0; i < 10; i++)
        {
            dynamic eObj = new ExpandoObject();
            eObj.Property = i;
            objs.Add(eObj);
        }

        foreach (dynamic obj in objs)
        {
            obj.Property2 = "bubuValue" + obj.Property;
            obj.Property3 = "bubuValue" + obj.Property2;
        }

        foreach (dynamic obj in objs)
        {
            Console.WriteLine(obj.Property3);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...