【问题标题】:Set default value in a DataContract?在 DataContract 中设置默认值?
【发布时间】:2010-07-01 17:16:11
【问题描述】:

如何为 DataMember 设置默认值 例如下图:

我想默认设置 ScanDevice="XeroxScan"

    [DataMember]
    public string ScanDevice { get; set; }

【问题讨论】:

    标签: c# wcf datacontractserializer


    【解决方案1】:

    我通常用这样的模式来做这个:

    [DataContract]
    public class MyClass
    {
        [DataMember]
        public string ScanDevice { get; set; }
    
        public MyClass()
        {
            SetDefaults();
        }
    
        [OnDeserializing]
        private void OnDeserializing(StreamingContext context)
        {
            SetDefaults();
        }
    
        private void SetDefaults()
        {
            ScanDevice = "XeroxScan";
        }
    }
    

    不要忘记 OnDeserializing,因为在反序列化期间不会调用您的构造函数。

    【讨论】:

    • 谢谢丹。我有个问题。默认值为 XeroxScan,但如果用户通过 HPScan,它将采用 HPScan,对吗?
    • 你的意思是如果他们将设备传递给构造函数?如果是这样,是的,您可以在调用 SetDefaults 后在构造函数中设置属性,它将使用新值。如果您的意思是反序列化数据时,那也可以,因为在反序列化发生之前调用了 OnDeserializing。这样,您可以在反序列化期间填充属性之前设置所有初始“默认”状态。
    • 我试过了,但它似乎不起作用。 OnDeserializing 不是只能和二进制序列化一起使用吗?
    • @xr280xr,你用的是什么序列化器?这些特定属性供 DataContractSerializer 使用。
    • 同理。没关系,它正在正常工作,只是不是我想要的。我想我想要的是添加 EmitDefaultValue ,这样如果客户端没有指定一个值,服务器上的默认值将保持不变。正如我所拥有的,我认为客户端的 .NET 默认值会覆盖反序列化时服务器设置的默认值。
    【解决方案2】:

    如果您希望它始终默认为 XeroxScan,为什么不做一些简单的事情:

    [DataMember(EmitDefaultValue = false)]
    public string ScanDevice= "XeroxScan";
    

    【讨论】:

    • 您好 kd7,您的解决方案仅在我们在服务端使用 DataContract 时才有效,但对于将此 DataContract 作为参数传递的传入请求,这不起作用。作为替代解决方案,我们必须在 DataContract 中创建两个属性 [一个 Normal 和一个 Nullable],并将一个可为空的类型公开为 DataMember,并将公开字段中的值设置为 Non-Exposed 字段。
    • 它适用于类型默认值和其他只是在构造函数中设置的更优雅的恕我直言
    猜你喜欢
    • 2012-01-23
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多