Почему добавление пользовательских объектов в List <T>в ApplicationSettingsBase через конструктор не работает? - PullRequest
0 голосов
/ 05 мая 2010

Это довольно тесно связано с другим вопросом SO.

Используя приведенный ниже пример, кто-нибудь может объяснить мне, почему добавление нового List<Foo>, где каждое из свойств Foo явно установлено, заставляет метод ApplicationSettingsBase.Save() правильно хранить данные, тогда как добавление нового Foo в список через конструктор (где конструктор устанавливает значения свойств) не работает? Спасибо!

public class Foo
{
    public Foo(string blah, string doh)
    {
        this.Blah = blah;
        this.Doh = doh;
    }

    public Foo() { }

    public string Blah { get; set; }
    public string Doh { get; set; }
}

public sealed class MySettings : ApplicationSettingsBase
{
    [UserScopedSetting]
    public List<Foo> MyFoos
    {
        get { return (List<Foo>)this["MyFoos"]; }
        set { this["MyFoos"] = value; }
    }
}

// Here's the question...
private void button1_Click(object sender, EventArgs e)
{
    MySettings mySettings = new MySettings();

    // Adding new Foo's to the list using this block of code doesn't work.
    List<Foo> theList = new List<Foo>()
    { 
        new Foo("doesn't","work")
    };

    // But using this block of code DOES work.
    List<Foo> theList = new List<Foo>()
    { 
        new Foo() {Blah = "DOES", Doh = "work"}
    };

   // NOTE: I never ran both the above code blocks simultaneously. I commented
   // one or the other out each time I ran the code so that `theList` was 
   // only created once.

    mySettings.MyFoos = theList;
    mySettings.Save();
}

Ответы [ 2 ]

0 голосов
/ 05 мая 2010

Я наткнулся на ответ, пытаясь прояснить свой вопрос только сейчас. Если я предоставлю конструктор по умолчанию для класса Foo:

public Foo() { }

- если все остальное оставить прежним, то значения класса правильно сохраняются в файле user.config при выполнении ApplicationSettingsBase.Save(). Weird.

0 голосов
/ 05 мая 2010

Это может быть связано с тем, как вы построили свой пример. Но, используя данный код, список «не работает» удаляется, когда вы выполняете раздел «работает». Если вы хотите, чтобы оба элемента были в theList в конце метода, у вас может быть только один вызов new List<Foo>().

...