代码之家  ›  专栏  ›  技术社区  ›  mono68

如何将字典强制转换为CollectionDataContractAttribute修饰类

  •  0
  • mono68  · 技术社区  · 15 年前

    这是我的第一个WCF服务。我定义了一个来自如下字典的响应消息:

    [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;
    

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

    这可能是一个普通的词典编纂问题,而不是一个WCF特定的问题,不是吗?

    非常感谢!

    2 回复  |  直到 15 年前
        1
  •  1
  •   onof    15 年前

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

    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);
    
        2
  •  2
  •   Jon Skeet    15 年前

    一般来说,这是一个强制转换的问题-不能强制转换对非强制转换类型的引用 事实上 在真实对象的层次结构中。

    你需要建立一个 GetAvailableProductsResponse 如果你想能够投进去的话。

    推荐文章