Как преобразовать словарь в украшенный класс CollectionDataContractAttribute - PullRequest
0 голосов
/ 05 августа 2010

это мой первый сервис 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 ]

2 голосов
/ 05 августа 2010

Это вообще проблема приведения - вы не можете привести ссылку на тип, который на самом деле не в иерархии реального объекта.построить реальный экземпляр GetAvailableProductsResponse, если вы хотите иметь возможность его приводить.

1 голос
/ 05 августа 2010

Нельзя приводить экземпляр объекта базового класса к производному типу, если он не является экземпляром производного.Вы можете поместить словарь в ответ как свойство:

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);
...