C# 使DataContract中的DataMember使用隐式转换为字符串运算符
有人知道是否可以只使用属性来使DataContract序列化使用类中属性类型的隐式转换为字符串运算符吗 例如:C# 使DataContract中的DataMember使用隐式转换为字符串运算符,c#,.net,wcf,datacontractserializer,C#,.net,Wcf,Datacontractserializer,有人知道是否可以只使用属性来使DataContract序列化使用类中属性类型的隐式转换为字符串运算符吗 例如: [DataContract] public class Root { [DataMember] public Element Member { get; set; } } public class Element { private string value; private Element(string value) { t
[DataContract]
public class Root
{
[DataMember]
public Element Member { get; set; }
}
public class Element
{
private string value;
private Element(string value)
{
this.value = value;
}
public static implicit operator string(Element element)
{
return element.value != null ? element.value : "";
}
public static implicit operator Element(string value)
{
if (Something()) return new Element(value);
throw new InvalidCastException()
}
}
(这只是仓促手写,不考虑任何编译问题等)
Lars Erik实现这一点的简单方法(比处理序列化问题更简单)如下:
[DataContract]
public class Root
{
[DataMember]
public string MemberString { get{ return (string)this.Member; } set{this.Member=(Element)value;} }
public Element Member { get; set; }
}
实现这一点的简单方法(比处理序列化问题更容易)如下:
[DataContract]
public class Root
{
[DataMember]
public string MemberString { get{ return (string)this.Member; } set{this.Member=(Element)value;} }
public Element Member { get; set; }
}
不这样做是有原因的。数据契约应该是简单的跨平台数据传输对象,所以我不会在这里使用magic。创建将基本类型转换为所需类型的不可序列化访问器属性。不这样做是有原因的。数据契约应该是简单的跨平台数据传输对象,所以我不会在这里使用magic。创建一个不可序列化的访问器属性,将基本类型转换为所需类型。您试图实现什么?您希望系统如何将字符串反序列化回元素?我希望它使用定义的两个运算符隐式地来回转换它。它可以像拥有一个名为type的DataMember属性一样简单。IE.[DataMember(Type=typeof(string))]您想要实现什么?您希望系统如何将字符串反序列化回元素?我希望它使用定义的两个运算符隐式地来回转换它。它可以像拥有一个名为type的DataMember属性一样简单。我想我必须走那条路,是的。缺点是,我试图从具有枚举的dto反序列化具有域值类型的命令。我想我必须用一个字符串成员把值类型弄得乱七八糟。我想我也会切换到命令上的枚举,让它在执行时转换为值类型。语义元素变成了领域外已知的ElementEnum。我想我必须这样做,是的。缺点是,我试图从具有枚举的dto反序列化具有域值类型的命令。我想我必须用一个字符串成员把值类型弄得乱七八糟。我想我也会切换到命令上的枚举,让它在执行时转换为值类型。Meansion元素成为域外已知的ElementEnum。请参阅下一篇文章中的注释:)请参阅下一篇帖子的评论:)