WCF,生成的DataMember List<>代理类属性为空?
我正在使用 WCF 中的一个简单对象,该对象用 DataContract
和 DataMember
属性装饰。我有一个 List
属性,并特意将其设计为在第一次访问时实例化支持字段(如果为 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;
}
}
}
问题是,在生成的客户端/代理类上,如果不第一次手动实例化它,我就无法访问该属性,因为它是空的(这是上面的 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 相当陌生,所以也许我在这里遗漏了一些东西?我认为代理类生成会遵循 DataMember
属性中的 if
逻辑?
我只是使用内置的 VS 2010 WCF 工具来生成代理类等,并没有进行自定义序列化。
任何见解将不胜感激!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
生成的代码不会复制您的实现,只会复制您的结构,这就是为什么您必须在客户端初始化您的属性。
如果您想在客户端和服务器上实现相同的实现,则需要查看共享合约。
基本上,您可以在单独的程序集中定义合约,然后在客户端和服务器端使用相同的合约。
http://msdn.microsoft.com/en-us/library/aa480190.aspx
Generated code doesn't copy your implementation, just your structure which is why you're having to initialise your property on the client side.
If you want to have the same implementation on client and server you need to look at shared contracts.
It's basically where you define your contracts in a seperate assembly and then use the same one on the client and server side.
http://msdn.microsoft.com/en-us/library/aa480190.aspx