C# 将对象从jsonb强制转换为不同的对象

C# 将对象从jsonb强制转换为不同的对象,c#,reflection,casting,jsonb,C#,Reflection,Casting,Jsonb,我正在开发一个ASP.NET核心API,它使用带有MediatR的事件在系统中发布它们。我希望在Api中包含一个调度服务,其中事件存储在数据库中,稍后取出并使用MediatR发布 我遇到的问题是,对象作为jsonb存储在数据库中,我需要能够将它们提取出来并将它们转换为特定的对象类型。我可以将类型的名称存储在数据库中,并通过这种方式访问该类型。然而,我无法在网上找到解决方案 如果有更好的方法来做这件事,世卫组织也会很有帮助,但我正在寻找一个类似这样的解决方案: var eventType = Ty

我正在开发一个ASP.NET核心API,它使用带有
MediatR
的事件在系统中发布它们。我希望在Api中包含一个调度服务,其中事件存储在数据库中,稍后取出并使用
MediatR
发布

我遇到的问题是,对象作为
jsonb
存储在数据库中,我需要能够将它们提取出来并将它们转换为特定的对象类型。我可以将类型的名称存储在数据库中,并通过这种方式访问该类型。然而,我无法在网上找到解决方案

如果有更好的方法来做这件事,世卫组织也会很有帮助,但我正在寻找一个类似这样的解决方案:

var eventType = Type.GetType("foo");
var eventObject = obj.ToObject<eventType>();
var eventType=Type.GetType(“foo”);
var eventObject=obj.ToObject();
如果有更好的方法,请告诉我


谢谢。

假设您能够找到一种方法来实现这一点,那么在您成功创建了
eventObject
之后,您打算如何使用它呢?它的类型在编译时是未知的,所以您不能编写使用它的方法和属性的代码,因为您不知道它有哪些方法和属性

例如,如果您有一个带有
DoFoo()
方法的“foo”类型和一个带有
DoBar()
方法的“bar”类型,您如何知道是调用
DoFoo()
还是
DoBar()

好吧,如果你要这样做,你可以把它放在同一个if块中,这样就消除了你的问题

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);

这样做的原因是MediatR发布对象并在系统中查找正确类型的处理程序。因此,如果类型是
Foo
,那么
mediatR.Publish(Foo)
会找到处理程序
INotificationHandler
,这样我们就可以确定我们将对象强制转换为什么。我在文章的末尾附加了另一个示例,演示如何将对象传递到适当的泛型方法,而无需强制转换。请参阅下面的评论,但是MediatR将对象传递给相关的
处理程序
方法,因此我们知道该点的类型并可以对其执行操作。
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);