首页 > 解决方案 > 使用接口和/或基类来处理属性将具有不同数据类型的对象

问题描述

我从 API 得到以下信息

{
  "quiz_submission_events": [
    {
      "id": "3409",
      "event_type": "question_answered",
      "event_data" : {"answer": "42"}
      "created_at": "2014-11-16T13:37:21Z"
    },
    {
      "id": "3410",
      "event_type": "question_flagged",
      "event_data" : { "question_id": "1", "flagged": true }
      "created_at": "2014-11-16T13:37:27Z"
    }
  ]
}

我正在尝试创建对象来表示这些数据,然后可以在代码中使用。

我目前有这样的东西

public class PlatformQuizSubmissionEvents
{
    public List<IPlatformQuizSubmissionEvent> QuizSubmissionEvents;
}

public interface IPlatformQuizSubmissionEvent 
{
    public int Id { get; set; }
    public string EventType { get; set; }
    public DateTime CreatedAt { get; set; }
    public IQuestionEventData EventData { get; set; }
}

public class PlatformQuizSubmissionEventBase : IPlatformQuizSubmissionEvent
{
    public int Id { get; set; }
    public string EventType { get; set; }
    public DateTime CreatedAt { get; set; }
    public IQuestionEventData EventData { get; set; }
}

public class QuestionAnsweredEvent : PlatformQuizSubmissionEventBase
{
    public new QuestionAnsweredEventData EventData { get; set; }
}

public interface IQuestionEventData { }

public class QuestionAnsweredEventData : IQuestionEventData
{
    public string QuestionId { get; set; }
    public string Answer { get; set; }
}
    

然后,例如,如果我只想返回“question_answered”事件,我有这样的事情

public List<QuestionAnsweredEvent> GetUserQuizSubmissionQuestionAnswerEvents(
    string courseId, string quizId, int submissionId)
{
    PlatformQuizSubmissionEvents submissionEvents = 
        _ApiRepository.GetUserQuizSubmissionEvents(courseId, quizId, submissionId);

    List<QuestionAnsweredEvent> filtered = submissionEvents.QuizSubmissionEvents
        .Where(qse => qse.EventType == "question_answered")
        .ToList();
}

在这条线上

我收到这个错误

CS0029:无法将类型“System.Collections.Generic.List<QuizTime.Core.LTIPlatforms.Shared.IPlatformQuizSubmissionEvent>”隐式转换为“System.Collections.Generic.List<QuizTime.Core.LTIPlatforms.Shared.QuestionAnsweredEvent>”

所以,我知道我从这段代码中得到的将是作为 QuestionAnsweredEvent 对象列表的数据。但是,我不确定如何最好地表示这一点,以便 c# 编译器可以处理这个问题。我将尝试 Automapper,但我不确定这是否是解决此问题的正确方法:也许我只是错误地设置了我的接口/类?

标签: c#.net-core

解决方案


推荐阅读