当前位置: 首页 > 知识库问答 >
问题:

在C#工厂中升级到“父类型”

武琛
2023-03-14

这是我想写在最后的代码:

var notification = NotificationFactory.FromJson(jsonString);

if (notification is UserUpdateProfileNotification)
{
  // notification is of type UserUpdateProfileNotification so I can access notification.Payload.AccoundId
}

这是我目前所尝试的:

public abstract class Notification<T>
{
    public string Type { get; set; }
    public T Payload { get; set; }
}


public class UserUpdateProfileNotificationPayload
{
    public Guid AccountId { get; set; }
}

public class UserUpdateProfileNotification: Notification<UserUpdateProfileNotificationPayload>
{
    public UserUpdateProfileNotification(UserUpdateProfileNotificationPayload payload)
    {
        Type = "USER_UPDATE_PROFILE";
        Payload = payload;
    }
}

public static class NotificationFactory
{
    public static Notification<object> FromJson(string notification)
    {
        var parsedNotif = JsonSerializer.Deserialize<Notification<object>>(notification);

        if (parsedNotif.Type == "USER_UPDATE_PROFILE")
        {
             var concreteType = JsonSerializer.Deserialize<UserUpdateProfileNotification>(notification);
            return new UserUpdateProfileNotification(concreteType.Payload);
        }

        throw new NotImplementedException();
    }
}

我得到的错误:

不能隐式地将类型UserUpdateProfileNotify转换为Notification

对我来说,转换通知


共有2个答案

牟嘉
2023-03-14

我发现您的代码有编译错误,但是如果您按照以下方式修改FromJson中的代码,那么它应该可以工作

    public static T FromJson<T>(string notification)
    {
        var parsedNotif = System.Text.Json.JsonSerializer.Deserialize<Notification<object>>(notification);

        if (parsedNotif.Type == "USER_UPDATE_PROFILE")
        {
            var payload = System.Text.Json.JsonSerializer.Deserialize<UserUpdateProfileNotificationPayload>(parsedNotif.Payload.ToString());
            object userUpdateProfileNotification = new UserUpdateProfileNotification(payload);
            return (T) userUpdateProfileNotification;
        }

        throw new NotImplementedException();
    }
陈野
2023-03-14

我得到了一些工作(我使用动态而不是通知和模式匹配工作)

工厂

public class NotificationFactory
{
    public static dynamic FromJson(string notification)
    {
        var parsedNotif = JsonSerializer.Deserialize<Notification<dynamic>>(notification);

        if (parsedNotif.Type == "USER_UPDATE_PROFILE")
        {
            var concreteType = JsonSerializer.Deserialize<UserUpdateProfileNotification>(notification);
            return new UserUpdateProfileNotification(concreteType.Payload);
        }

        throw new NotImplementedException();
    }
}

我如何使用:

  var notification = NotificationFactory.FromJson(item);

  if (notification is UserUpdateProfileNotification notif)
  {
      log.LogInformation($"{notif.Payload.AccountId}");
  }

双重解析不是最优的,但在我的情况下是可以接受的

 类似资料:
  • 我们正在使用eclipse开普勒服务发布2,Tomcat 7.0.64,JDk1.7。我们以前使用的是流口水5.4.0,现在我们已经升级了流口水6.2.0。作为升级的一部分,我们在构建路径和Web应用程序库文件夹中添加了以下文件。 1.drools-compiler-6.2.0。期末考试-红帽-4。罐子 2。drools-core-6.2.0。期末考试-红帽-4。罐子 3。ecj-4.3.1。罐子

  • 我有两个从抽象类继承的类,它们有父子关系。 所以我使用了注释OneToOne和ManyToOne,但是子类中的父实体总是为空。有人能帮我吗,我花了几个小时谷歌和测试了许多conf,但没有成功。 这些是我的类中的代码: ... ... ... 如果我不添加@JoinCol列注释,JPA会创建一个关联表,但无法检索父级,而关联可以直接通过在数据库中请求来完成。 非常感谢你的帮助。 祝好

  • 我正在运行《docker compose》中的jenkins,来自图片jenkins/jenkins。升级到Jenkins 2.277.1后,LDAP身份验证停止工作,我无法登录。我收到以下错误: 詹金斯。docker。new\u 1 | 2021 06-04 14:49:31.3110000[id=138]警告o.j.p.p.DiskUsageCollector#collect:无法获取磁盘使用

  • 我正在使用QT Creator在Ubuntu上制作一个C++程序。我编写的程序编译得很好,直到我决定开始使用C++11而不是C++98(这是QT Creator中的默认值)。我使用的是自己的cmake文件,而不是qmake,为此,我在中包含了以下一行: 在转移到C++11之后,我在行得到一个错误。这是因为,据我所见,变量在任何地方都没有定义,尽管定义了变量。 因此,我有两个问题: 1)为什么变量没

  • 问题内容: 我当前正在将Hibernate版本升级到最新版本5.2.10。我将HibernateUtil中的代码替换为SessionFactory创建。 4.3.11 Final(Previous) : 5.2.10决赛(新): 现在,我有了一个方法,该方法通过将数据库表名称作为字符串传递来获取列名称列表。我之前在4.3.11.Final中这样做过: 现在,升级后,它显示方法getAllClass

  • 我目前正在花时间将我的项目从Laravel 4.2升级到Laravel 5.2。 在经历了很多麻烦之后,我设法使5.1版本正常运行,因此我启动了5.1到5.2程序,如官方文件中所述:https://laravel.com/docs/5.2/upgrade#upgrade-5.2.0 第一步之后,我的composer.json是这样的: 我还更新了app.php配置以删除提供程序部分中的Artisa