Десериализовать анонимный тип в динамический

У меня есть приложение, которое содержит бизнес-объект под названием "Задача". Эта сущность обладает фиксированным набором свойств, но также способна вести себя как экспансия.

Итак, его схема выглядит так:

namespace RavenResearch
{
    public class Task
    {
        public Guid TaskId { get; set; }
        public DateTime CreatedDate { get; set; }
        public dynamic DynamicProperties { get; set; }
    }
}

Когда это хранится в RavenDB, это выглядит так

{
  "TaskId": "9cac592f-98ec-4fda-a823-e5402736078e",
  "CreatedDate": "2011-09-22T10:25:35.2701544+12:00",
  "DynamicProperties": {
    "$type": "<>f__AnonymousType0`2[[System.Int32, mscorlib],[System.String, mscorlib]], RavenResearch",
    "MatterNumber": 0,
    "CustomerNumber": "37"
  }
}

Конечно, когда я пытаюсь запросить это хранилище данных из другой программы, он пытается найти анонимный тип, содержащий int и строку. Эта другая программа - EXE, которая первоначально сохранила документ - я не хочу ссылаться на это.

Что было бы лучшим способом вытащить динамические свойства? Моя цель - иметь возможность запросить список объектов Task из Raven и передать их в Xaml для рендеринга в пользовательском интерфейсе, поэтому привязка данных к Expando так привлекательна для меня, что свойства не должны быть известны во время компиляции.

Я создаю экземпляры (для хранения в Raven) с такими утверждениями

new RavenResearch.Task()
{
    TaskId = Guid.NewGuid(),
    CreatedDate = DateTime.Now,
    DynamicProperties = new 
    {
        MatterNumber = 0,
        CustomerNumber = "37"
    }
}

@Jacob: я бы потерял всю информацию о типах динамических свойств, если бы использовал словарь - однако я мог бы сделать что-то вроде этого:

public class Task
{
    public Guid TaskId { get; set; }
    public DateTime CreatedDate { get; set; }
    public Dictionary<string, SimpleValue> DynamicProperties { get; set; }
}

public abstract class SimpleValue
{

}

public class SimpleValue<T> : SimpleValue
{
    public T Value
    { get; set; }

    public SimpleValue(T value)
    {
        this.Value = value;
    }
}

2 ответа

Решение

Может быть, избегая использования dynamic лучше всего в этом случае. Если вы используете Dictionary<string, object> вместо этого, создавая Task не будет слишком ужасно

new RavenResearch.Task {
    TaskId = Guid.NewGuid(),
    CreatedDate = DateTime.Now,
    DynamicProperties = new Dictionary<string, object> {
        { "MatterNumber", 0 },
        { "CustomerNumber", "37" } 
    }
}

Помните, что во время выполнения динамический объект - это просто объект, у нас нет возможности узнать, что вы на самом деле имели в виду. Возможно, вам лучше использовать RavenJObject вместо этого. Это был бы более естественный способ работы с динамическими данными, и он сохранит информацию о типе

Другие вопросы по тегам