我正在使用DataContract
和DataMember
属性修饰的WCF中的简单对象。我有一个List<T>
属性,并故意设计它以在第一次访问时实例化支持字段(如果为null)。该类的缩写版本如下。
[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;
}
}
}
问题是,在生成的客户端/代理类上,我无法在第一次手动实例化时无法访问该属性,因为它是null(这是上面if
逻辑应该处理的内容)。
下面的第二行代码返回null:
//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很新,所以也许我在这里错过了一些东西?我认为代理类生成会尊重if
属性中的DataMember
逻辑?
我只是使用内置的VS 2010 WCF工具来生成代理类等,并且还没有进入自定义序列化。
任何见解都将不胜感激!
答案 0 :(得分:5)
生成的代码不会复制您的实现,只是您的结构,这就是您必须在客户端初始化您的属性的原因。
如果您希望在客户端和服务器上具有相同的实现,则需要查看共享合同。
它基本上是在单独的程序集中定义合同,然后在客户端和服务器端使用相同的合同。