发送具有从WCF服务中的相同父派生的不同类的对象列表

时间:2017-04-24 08:24:38

标签: c# asp.net wcf

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发送到移动应用程序。这可能吗?

1 个答案:

答案 0 :(得分:2)

如果您尚未为自定义类型定义Data Contract(例如Question类型),则只会对您班级的公共属性进行序列化。

通常,为自定义类型明确定义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; } = "";
}