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服务发送包含QuestionMultipleChoice
和QuestionTrueOrFalse
的对象列表。返回对象是:
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发送到移动应用程序。这可能吗?
答案 0 :(得分:2)
如果您尚未为自定义类型定义Data Contract(例如Question
类型),则只会对您班级的公共属性进行序列化。
通常,为自定义类型明确定义Data Contract和Data 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; } = "";
}