【问题标题】:Make a DataMember in a DataContract use implicit cast to string operator使 DataContract 中的 DataMember 使用隐式转换为字符串运算符
【发布时间】:2011-12-15 20:20:18
【问题描述】:

有人知道是否可以仅使用属性来使 DataContract 序列化使用隐式转换为类中属性类型的字符串运算符?

例如:

[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()
    }
}

(这只是手忙脚乱写的,不管编译等问题)

拉斯-埃里克

【问题讨论】:

  • 你想达到什么目的?
  • 您希望系统如何将字符串反序列化回元素?
  • 我希望它使用定义的两个运算符来隐式地来回转换它。它可以像拥有一个名为 type 的 DataMember 属性一样简单。 IE。 [DataMember(Type=typeof(string))]

标签: c# .net wcf datacontractserializer


【解决方案1】:

不这样做是有原因的。 Data Contracts 应该是简单的跨平台数据传输对象,所以我不会把魔法放在那里。创建一个不可序列化的访问器属性,将基本类型转换为您需要的类型。

【讨论】:

  • 查看下一篇文章的评论.. :)
【解决方案2】:

实现这一点的简单方法(比处理序列化问题更容易)是这样的:

[DataContract]
public class Root
{
    [DataMember]
    public string MemberString { get{ return (string)this.Member; } set{this.Member=(Element)value;} }

    public Element Member { get; set; }
}

【讨论】:

  • 我想我必须走那条路,是的。缺点是我试图从具有枚举的 dto 反序列化具有域值类型的命令。我想我必须用字符串成员来混淆值类型。
  • 我想我也会切换到命令上的枚举,并让它在执行时转换为值类型。含义 Element 成为域外已知的 ElementEnum。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-01
  • 1970-01-01
  • 2017-03-23
  • 2019-03-24
相关资源
最近更新 更多