首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >WCF服务代理未设置"FieldSpecified“属性

WCF服务代理未设置"FieldSpecified“属性
EN

Stack Overflow用户
提问于 2009-11-05 20:47:57
回答 5查看 16K关注 0票数 17

我有一个WCF DataContract,如下所示:

代码语言:javascript
复制
namespace MyCompanyName.Services.Wcf
{
  [DataContract(Namespace = "http://mycompanyname/services/wcf")]
  [Serializable]
  public class DataContractBase
  {
    [DataMember]
    public DateTime EditDate { get; set; }

    // code omitted for brevity...
  }
}

当我在Visual Studio中添加对此服务的引用时,会生成以下代理代码:

代码语言:javascript
复制
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3082")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://mycompanyname/services/wcf")]
public partial class DataContractBase : object, System.ComponentModel.INotifyPropertyChanged {

    private System.DateTime editDateField;

    private bool editDateFieldSpecified;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order=0)]
    public System.DateTime EditDate {
        get {
            return this.editDateField;
        }
        set {
            this.editDateField = value;
            this.RaisePropertyChanged("EditDate");
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool EditDateSpecified {
        get {
            return this.editDateFieldSpecified;
        }
        set {
            this.editDateFieldSpecified = value;
            this.RaisePropertyChanged("EditDateSpecified");
        }
    }

    // code omitted for brevity...
}

正如您所看到的,除了为EditDate生成一个支持属性之外,还会生成一个额外的<propertyname>Specified属性。都很好,除了当我执行以下操作时:

代码语言:javascript
复制
DataContractBase myDataContract = new DataContractBase();
myDataContract.EditDate = DateTime.Now;

new MyServiceClient.Update(new UpdateRequest(myDataContract));

EditDate未被服务的终结点拾取(未出现在传输的XML中)。

我调试了代码,发现虽然我设置了EditDate,但EditDateSpecified属性并没有像我预期的那样被设置为true;因此,EditDate序列化程序忽略了它的值,即使它被设置为一个有效值。

作为一个快速技巧,我修改了EditDate属性,使其如下所示:

代码语言:javascript
复制
   /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order=0)]
    public System.DateTime EditDate {
        get {
            return this.editDateField;
        }
        set {
            this.editDateField = value;

            // hackhackhack
            if (value != default(System.DateTime))
            {
              this.EditDateSpecified = true;
            }
            // end hackhackhack

            this.RaisePropertyChanged("EditDate");
        }
    }

现在代码按预期工作,但当然每次我重新生成代理时,我的修改都会丢失。我可以将调用代码更改为以下代码:

代码语言:javascript
复制
DataContractBase myDataContract = new DataContractBase();
myDataContract.EditDate = DateTime.Now;
myDataContract.EditDateSpecified = true;

new MyServiceClient.Update(new UpdateRequest(myDataContract));

但这似乎也是一种黑客式的浪费时间。

所以,最后,我的问题是:有没有人对如何克服Visual Studio服务代理生成器的这种不直观(和IMO破坏)的行为有什么建议,或者我只是遗漏了什么?

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1680356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档