【问题标题】:Send list of objects with different classes derived from same parent in a WCF service发送具有从 WCF 服务中的同一父级派生的不同类的对象列表
【发布时间】:2017-04-24 08:24:38
【问题描述】:
public class Question {    
    String QuestionsID = ""; 
}
public class QuestionTrueOrFalse : Question {
    public string Answer ="";
}
public class QuestionMultipleChoice : Question {
    public List<MultipleChoiceOption> obj;
}
public class MultipleChoiceOption {
    public int OptionMultipleChoiceID = 0;
    public string OptionsTextAr = "", Answer = "";
}

我有两个派生自同一个父类的类,如上所示,我想从 Web 服务发送一个包含 QuestionMultipleChoiceQuestionTrueOrFalse 的对象列表。返回对象为:

public class ReturnedObjectList<T>{   
    public List<T> ListItems = new List<T>);   
    public string Status="" ,Message="";
}

我的网络服务是:

public ReturnedObjectList<Question> SelectQuestions(string ID)
{ 
    ReturnedObjectList<Question> obj = new ReturnedObjectList<Question>();
    obj.ListItems.Add(new QuestionMultipleChoice());
    obj.ListItems.Add(new QuestionTrueOrFalse());
    return obj;
}

当我在 Postman 中测试此 Web 服务时,我没有得到任何响应。

只有当我在列表中添加一种类型的对象时,代码才会起作用,即。如果我将返回的对象更改为仅包含一种类型的对象:

ReturnedObjectList<QuestionMultipleChoice> obj = new ReturnedObjectList<QuestionMultipleChoice>();

我想将一个列表中的所有类型的问题以 json 格式发送到移动应用程序。这可能吗?

【问题讨论】:

    标签: c# asp.net wcf


    【解决方案1】:

    如果您没有为您的自定义类型(例如您的 Question 类型)定义 Data Contract,则只会序列化您类上的公共属性。

    一般来说,为您的自定义类型明确定义 Data ContractData Member 是个好主意。

    我会为您的自定义类型建议以下类定义:

    [DataContract]
    public class Question
    {
        [DataMember]
        String QuestionsID { get; set; } = "";
    }
    
    [DataContract]
    public class QuestionTrueOrFalse : Question
    {
        [DataMember]
        public string Answer { get; set; } = "";
    }
    
    [DataContract]
    public class QuestionMultipleChoice : Question
    {
        [DataMember]
        public List<MultipleChoiceOption> obj { get; set; }
    }
    
    [DataContract]
    public class MultipleChoiceOption
    {
        [DataMember]
        public int OptionMultipleChoiceID { get; set; } = 0;
        [DataMember]
        public string OptionsTextAr { get; set; } = "";
        [DataMember]
        public string Answer { get; set; } = "";
    }
    

    您还需要将KnownTypeAttribute 添加到您的ReturnedObjectList,然后您可以返回Question 的列表。

    ReturnedObjectList 尝试以下代码:

    [DataContract]
    [KnownType(typeof(QuestionTrueOrFalse))]
    [KnownType(typeof(QuestionMultipleChoice))]
    public class ReturnedObjectList<Question>
    {
        [DataMember]
        public List<Question> ListItems = new List<Question>();
        [DataMember]
        public string Status { get; set; } = "";
        public string Message { get; set; } = "";
    }
    

    【讨论】:

    • 感谢重播。现在我得到了邮递员的结果,但它是空的。但在函数中它返回了两个对象
    • 存在语法错误,修复后无效 [OperationContract] [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)] public ReturnedObjectListQ SelectQuestions(string QIDs, string StudentID, string QuizID, string Pending) { ReturnedObjectListQ obj = new ReturnedObjectListQ(); obj.ListItems.Add(new QuestionMultipleChoce()); obj.ListItems.Add(new QuestionTrueOrFalse());返回对象; } 本次通话中的任何问题
    • 当我将 [datamember] 添加到此类时 public class ReturnedObjectList { public List ListItems = new List();公共字符串状态=“”,消息=“”; } 它有效。如果你编辑你的答案,我会接受它。谢谢你重播:)
    • 对,我在ReturnedObjectList 上错过了[DataMemeber] :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多