Десериализовать анонимный тип в динамический
У меня есть приложение, которое содержит бизнес-объект под названием "Задача". Эта сущность обладает фиксированным набором свойств, но также способна вести себя как экспансия.
Итак, его схема выглядит так:
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 вместо этого. Это был бы более естественный способ работы с динамическими данными, и он сохранит информацию о типе