2011-03-25 63 views
2

我正在用WCF中的一个简单对象装饰DataContractDataMember属性。我有一个List<T>属性,并故意将其设计为在第一次访问时实例化后备字段(如果为null)。下面是该课程的缩写版本。WCF,生成的DataMember List <>代理类属性为空?

[DataContract] 
public class FieldSetData 
{ 
    private List<FormFieldData> _formFields; 

    [DataMember] 
    public List<FormFieldData> FormFields 
    { 
     get 
     { 
      if (this._formFields == null) 
      { 
       this._formFields = new List<FormFieldData>(); 
      } 
      return this._formFields; 
     } 
     set 
     { 
      this._formFields = value; 
     } 
    } 
} 

的问题是,在生成的客户端/代理类,我不能没有,因为它是空(这是上面的if逻辑应该处理)手动实例它的第一次访问属性。

的代码下面的回报,第二行空:

//proxy class version 
FieldSetData data = new FieldSetData(); 
data.FormFields.Add(new FormFieldData()); //FormFields property is null 

我必须这样做,而不是:

//instantiate the List<T> property 
FieldSetData data = new FieldSetData { FormFields = new List<FormFieldData>() }; 
data.FormFields.Add(new FormFieldData()); 

我是相当新的WCF所以也许我失去了一些东西?我认为代理类生成会兑现DataMember属性中的if逻辑?

我只是使用内置VS 2010 WCF工具来生成代理类等,并没有进入自定义序列化。

任何有识之士将不胜感激!

回答

5

生成的代码不会复制您的实现,只是您的结构,这就是为什么您必须在客户端初始化您的属性。

如果您希望在客户端和服务器上具有相同的实现,则需要查看共享协定。

这基本上就是您在单独程序集中定义合同的位置,然后在客户端和服务器端使用相同的合同。

http://msdn.microsoft.com/en-us/library/aa480190.aspx

+0

谢谢。我想我必须脱离我对此的期望。我曾经玩过双方共享的组件,但没有多少运气。肯定会对你拥有的任何资源感兴趣。 +1 – 2011-03-25 14:37:45

+0

+1斑点。 – Aliostad 2011-03-25 14:38:39

+0

谷歌搜索“wcf共享合同”带来了大量的东西 – BenCr 2011-03-25 14:40:49

相关问题