将列表转换为对象

本文关键字:转换 对象 列表 | 更新日期: 2023-09-27 18:34:56

我正在构建一个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,根据他们的输入,我要么处理ReturnData要么TagDetailData

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

当我尝试时

var newData = new List<TagDetailData>();
newData.Add(new TagDetailData
                            {
                                key = "Test",
                                description = "Tester"
                            });
this.Data = (List<TagDetailData>)newData;

该服务根本无法加载响应数据,并且我没有收到任何异常。

将列表<T>转换为对象

对于

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 序列化程序无法序列化类型"对象"或类型"动态"。这就是为什么你的合约方法不产生输出。泛型类型解析为本身可序列化的实际类型。

有人建议你可以使用基类。我还没有尝试过这个,但我怀疑它不起作用,因为数据协定与您实际尝试序列化的内容不匹配。

我已经有一段时间没有在

WCF工作了。您可能需要使用 DataContract 和 DataMember 属性装饰我的结果包装器。

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

您是否尝试启用 WCF 日志记录?了解如何打开 wcf 跟踪

您可能需要添加属性来告知数据协定序列化程序需要哪些类型的数据。例如,请参阅此 MSDN 博客

你可以

选择:

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

稍后,您可以测试 description 的 null 值并确定它是由哪个对象进行的;或者,您可以添加一个 enum 属性来明确此差异。