如何将Dictionary转换为CollectionDataContractAttribute修饰类

时间:2010-08-05 15:06:59

标签: wcf collections c#-3.0 dictionary casting

这是我的第一个WCF服务。我定义了一个源自Dictionary的响应消息,如下所示:

[CollectionDataContract(ItemName = "Product", KeyName = "ProductNumber", ValueName = "ProductName")]
public class GetAvailableProductsResponse : Dictionary<string, string> { }

当我尝试在服务操作中运行以下代码时,它会因无法强制转换而抛出异常:

Dictionary<string, string> result = new Dictionary<string, string>();
GetAvailableProductsResponse responseMsg = (GetAvailableProductsResponse)result;

实际上我没有实例化一个新的Dictionary但是我正在调用一个返回Dictionary的业务对象,所以我需要以某种方式将它转换为响应消息。

这可能是一般而不是WCF特定问题的问题,不是吗?

非常感谢提前!

2 个答案:

答案 0 :(得分:2)

这是一般的强制转换问题 - 你不能在真实对象的层次结构中强制引用一个不是实际的类型。

如果您希望能够投射到GetAvailableProductsResponse,则需要构建一个真实的实例。

答案 1 :(得分:1)

如果基类对象的实例不是派生的实例,则无法将其转换为派生类型。您可以将字典作为属性放在响应中:

public class GetAvailableProductsResponse
{
public Dictionary<string, string> Products { get; set; }
}

Dictionary<string, string> result = new Dictionary<string, string>();
GetAvailableProductsResponse responseMsg = new GetAvailableProductsResponse { Products = result; }

修改: 如果您希望保留继承,则必须为该类指定构造函数:

public class GetAvailableProductsResponse : Dictinary<string, string>
{
public GetAvailableProductsResponse(Dictionary<string, string> d) : base(d) {}
}

GetAvailableProductsResponse responseMsg = new GetAvailableProductsResponse(result);