Добавление информации с поздней привязкой к объекту в C # с использованием динамического ключевого слова? - PullRequest
0 голосов
/ 31 августа 2010

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

    public class MySpecialObject {
       public int Id { get; set; }
       public string OneProperty { get; set; }
       public string ASecondProperty { get; set; }
    }

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

    ///Retrieve object from database
    var MySpecialObject = specialObjectRepository.Get(id);

    MySpecialObject.["DynamicProperty"] = "Dynamic Property!";

    ///Pretend I do Json serialization here
    return MySpecialObject;

Это очевидно выдумано, но я надеюсь, что я пытаюсь сделать, ясно.В Javascript это действительно легко сделать, так как оно свободно набрано.Я думал, что с ключевым словом dynamic в C # 4.0 это было бы возможно, но похоже, что это не то, для чего оно (хотя я мог бы полностью упустить очевидное).Я думаю, я мог бы создать класс для подобных ситуаций, но было бы проще сделать это в одну строку.Я знаю, это звучит лениво, но кажется, что то, что я пытаюсь сделать, должно быть возможным.

Ответы [ 2 ]

1 голос
/ 31 августа 2010

Вы хотите наследовать от ExpandoObject . В нем реализованы все необходимые функции для динамического объекта.

0 голосов
/ 31 августа 2010

Вы должны использовать новый класс ExpandoObject:

    public class MySpecialObject:ExpandoObject {
       public int Id { get; set; }
       public string OneProperty { get; set; }
       public string ASecondProperty { get; set; }
    }

и перед сериализацией просто напишите:

var MySpecialObject = specialObjectRepository.Get(id);

MySpecialObject.DynamicProperty = "Dynamic Property!";

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

...