У меня есть служба WCF, которая предоставляет тип TestTypeOne
, который в настоящее время имеет строковое свойство с именем ProductId
:
public class TestTypeOne
{
[DataMember(Name = "ProductId")]
public string ProductId { get; set; } //note it's a string at the moment
}
Я хочу изменить тип этого свойства с string
на пользовательский тип значения с именем ProductId
, но без разрыва контракта WCF (это только для серверной стороны, клиенты должны видеть ProductId
как Строка еще.)
public class TestTypeOne
{
[DataMember(Name = "ProductId")]
public ProductId ProductId { get; set; }
}
Пользовательский тип выглядит примерно так (большая часть кода удалена для краткости):
public struct ProductId : IEquatable<ProductId>
{
readonly string productId;
public ProductId(string productId)
{
this.productId = productId
}
public override string ToString() => productId ?? string.Empty;
}
Используя следующий тестовый код:
var sb = new StringBuilder();
using (var writer = new XmlTextWriter(new StringWriter(sb)))
{
var dto = new TestTypeOne {
ProductId = new ProductId("1234567890123")
};
var serializer = new DataContractSerializer(typeof(TestTypeOne));
serializer.WriteObject(writer, dto);
writer.Flush();
}
Console.WriteLine(sb.ToString());
Ожидаемый результат при сериализации должен быть:
<Scratch.TestTypeOne xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Tests">
<ProductId>1234567890123</ProductId>
</Scratch.TestTypeOne>
Я попытался реализовать ISerializable
, но, похоже, это позволяет мне контролировать только содержимое тега ProductId
xml, но не сам тег (поэтому я могу сделать так, как <ProductId><something>1234113</something></ProductId>
).
В идеале я хочу сделать что-то для самого типа ProductId
, так как этот тип используется во многих местах и во многих контрактах.