将List <t>转换为对象

时间:2016-02-16 07:51:30

标签: c# wcf

我正在构建一个WCF。我有一个名为Result

的班级
public class ReturnData 
{
     public string key { get; set; }
     public string[] value { get; set; }
}
public class TagDetailData 
{
     public string key { get; set; }
     public string description { get; set; }
}

public object Data { get; set; }    

回复会返回属性Data,我希望能够在回复中将List<ReturnData>List<TagDetailData>转换为Data

客户要求结果全部在Data,并根据他们的输入我处理ReturnDataTagDetailData

我可以将List转换为对象吗?也许我需要另一种方法?

当我尝试

var newData = new List<TagDetailData>();

newData.Add(new TagDetailData
                            {
                                key = "Test",
                                description = "Tester"
                            });

this.Data = (List<TagDetailData>)newData;

该服务无法加载响应数据,我没有得到任何异常。

3 个答案:

答案 0 :(得分:2)

对于WCF有效负载,您需要比“对象”更具体。尝试使用这样的通用包装:

public class Result<T> where T : class
{
    public Result() { }

    public Result(T data)
    {
        this.Data = data;
    }

    public T Data { get; set; }

}

这样,您可以创建所需类型的结果,例如:

var data = new List<TagDetailData>();

data.Add(new TagDetailData
{
    key = "Test",
    description = "Tester"
});

return new Result<List<TagDetailData>>(data);

T的类型可以由构造函数在这里推断,<ListTagDetailData>>实际上是不必要的。我在这里说明数据是任何类型的数据。此外,此类中仍然需要无参数构造函数,以使序列化程序正常工作。

WFC序列化程序无法序列化类型“object”或键入“dynamic”。这就是您的合约方法不产生任何产出的原因。泛型类型解析为可自行序列化的实际类型。

有人建议您使用基类。我没试过这个,但我怀疑它不会起作用,因为数据合同与你实际尝试序列化的内容不符。

自从我在WCF工作以来已经有一段时间了。您可能需要使用DataContract和DataMember属性修饰Result包装器。

如果您的端点严格基于Web(HTTP和HTTPS),请考虑使用WebAPI。

答案 1 :(得分:1)

您是否尝试启用WCF日志记录?见how-to-turn-on-wcf-tracing

您可能需要添加属性来告诉data-contract-serializer期望的数据类型。例如,请参阅此MSDN blog

答案 2 :(得分:1)

你可以选择:

public class ReturnItem
{
     public string   key         { get; set; }
     public string   description { get; set; }
     public string[] value       { get; set; }
}

public ReturnItem[] Data { get; set; }

稍后,您可以测试description的空值并找出它的对象;可选地,您可以添加枚举属性以明确区别。