WCF,生成的DataMember List<>代理类属性为空?

发布于 2024-10-26 04:43:08 字数 1282 浏览 2 评论 0 原文

我正在使用 WCF 中的一个简单对象,该对象用 DataContractDataMember 属性装饰。我有一个 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 工具来生成代理类等,并没有进行自定义序列化。

任何见解将不胜感激!

I'm working with a simple object in WCF decorated with the DataContract and DataMember attributes. I have a List<T> property and purposely designed it to instantiate the backing field on first access (if null). An abbreviated version of the class is below.

[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;
        }
    }
}

The problem is, on the generated client/proxy class, I can't access the property without instantiating it manually the first time because it's null (which is what the if logic above was supposed to handle).

The second line of code below returns null:

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

I have to do this instead:

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

I'm fairly new to WCF so perhaps I'm missing something here? I figured the proxy class generation would honor the if logic in the DataMember property?

I'm just using the built in VS 2010 WCF tools to generate the proxy classes, etc. and haven't gotten into custom serialization.

Any insight would be appreciated!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

妞丶爷亲个 2024-11-02 04:43:08

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

如果您想在客户端和服务器上实现相同的实现,则需要查看共享合约。

基本上,您可以在单独的程序集中定义合约,然后在客户端和服务器端使用相同的合约。

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文