Приведение объектов из JSONB в разные объекты - PullRequest
0 голосов
/ 23 октября 2019

Я разрабатываю ASP.NET Core API, который использует события с MediatR для их публикации в системе. Я надеюсь включить службу планирования в Api, где события хранятся в базе данных, а затем извлекаются и публикуются с использованием MediatR.

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

Если есть лучший способ сделать это, кому это тоже будет полезно, но я ищу решение, которое выглядит примерно так:

var eventType = Type.GetType("foo");
var eventObject = obj.ToObject<eventType>();

Если есть лучший способ сделать это, пожалуйста, дайте мне знать!

Спасибо.

1 Ответ

0 голосов
/ 24 октября 2019

Если вы сможете найти способ сделать это, как именно вы намереваетесь использовать eventObject после того, как вам удалось его создать? Его тип неизвестен во время компиляции, поэтому вы не можете написать код, который использует его методы и свойства, потому что вы не знаете, какие методы и свойства у него есть.

Например, если у вас есть тип "foo" с методом DoFoo() и тип "bar" с методом DoBar(), как узнать, вызывать ли DoFoo() или DoBar()?

var eventType = Type.GetType("foo");
var eventObject = obj.ToObject<eventType>();
eventObject.DoFoo();  //How do you know to do this?
eventObject.DoBar();  //How do you know to do this?

Лучшее, что вы можете сделать, - это серия операторов if:

if (eventType) == typeof(foo))
{
    eventObject.DoFoo();
}
if (eventType) == typeof(bar))
{
    eventObject.DoBar();
}

Что ж, если вы собираетесь это сделать, вы также можете разыграть его вТо же, если блок, который устраняет вашу проблему.

if (obj.GetType() == typeof(foo))
{
    ((foo)obj).DoFoo();
}
if (obj.GetType() == typeof(bar))
{
    ((bar)obj).DoBar();
}

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

mediatR.GetType()
    .GetMethod("Publish");
    .MakeGenericMethod(eventType);
    .Invoke(obj, null);
...