WCF, сгенерированный DataMember List <> свойство класса прокси имеет значение null? - PullRequest
2 голосов
/ 25 марта 2011

Я работаю с простым объектом в WCF, украшенным атрибутами DataContract и DataMember. У меня есть свойство List<T>, и я специально разработал его для создания экземпляра вспомогательного поля при первом доступе (если он нулевой). Сокращенная версия класса приведена ниже.

[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, так что, возможно, я что-то здесь упускаю? Я полагал, что генерация прокси-класса будет соблюдать логику if в свойстве DataMember?

Я просто использую встроенные в VS 2010 инструменты WCF для генерации прокси-классов и т. Д. И не попал в пользовательскую сериализацию.

Любое понимание будет оценено!

1 Ответ

5 голосов
/ 25 марта 2011

Сгенерированный код не копирует вашу реализацию, а только вашу структуру, поэтому вам нужно инициализировать ваше свойство на стороне клиента.

Если вы хотите иметь одинаковую реализацию на клиенте и сервере, вам нужно посмотреть общие контракты.

Это в основном то, где вы определяете свои контракты в отдельной сборке, а затем используете один и тот же на стороне клиента и сервера.

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

...