Вопрос
Вот код, демонстрирующий мою проблему (все в одном пространстве имен):
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Fubar.BGroup.A = true;
}
public Foo Fubar = new Foo();
}
public class Foo
{
public Foo()
{
}
private BoolGroup bGroup = new BoolGroup();
public BoolGroup BGroup
{
get{ return this.bGroup; }
set
{
this.bGroup = value;
this.doSomething();
}
}
}
public class BoolGroup
{
public BoolGroup()
{
}
private bool a;
public bool A
{
get { return this.a; }
set { this.a = value; }
}
}
private void doSomething()
{
....
}
Мне никогда не удастся выполнить функцию doSomething(), а я очень этого хочу.Что я делаю не так?Все значения будут установлены правильно, но я, кажется, никогда не вникал в эту установленную часть BGroup.
Спасибо
Решение
Вы никогда не устанавливали BGroup
совсем.Самое близкое, что вы делаете, это Fubar.BGroup.A = true
и bGroup = new BoolGroup();
.
Fubar.BGroup.A = true
получает тот BGroup
свойство и устанавливает A
недвижимость на BoolGroup
объект, он не устанавливает BGroup
.
bGroup = new BoolGroup()
устанавливает поле поддержки BGroup
собственность, вот почему вы получаете это BoolGroup
когда вы получаете BGroup
, но он не проходит через установщик.
Если вы хотите использовать установщик, ваш Foo
класс должен быть таким:
public class Foo
{
public Foo()
{
// Note uppercase on BGroup to access the property and
// not its backing field.
BGroup = new BoolGroup();
}
private BoolGroup bGroup;
public BoolGroup BGroup
{
get{ return this.bGroup; }
set
{
this.bGroup = value;
this.doSomething();
}
}
}
Другие советы
В своем коде вы никогда не устанавливаете BGroup.Вы устанавливаете A, который свойство компании БГрупп.
Попробуйте что-нибудь вроде
this.Fubar.BGroup = new BoolGroup();
Вы не вызываете установщик свойства BGroup с помощью этого оператора:
this.Fubar.BGroup.A = true;
«this.Fubar.BGroup» вызывает метод получения (возвращает BoolGroup), а с помощью «.A = true» вы вызываете метод установки свойства A BoolGroup.
this.Fubar.BGroup.A = true;
устанавливает свойство A Fubar.BGroup, а не Fubar.BGroup.
Ваш код выглядит нормально.Причина, по которой он не срабатывает, заключается в том, что вы фактически нигде не устанавливаете Fubar.BGroup.Вы устанавливаете Fubar.BGroup.A в конструкторе формы... это не запускает метод doSomething.Вам нужно сделать что-то вроде:
this.Fubar.BGroup = new BGroup();
или сделайте это внутри вашего конструктора Foo:
public Foo()
{
this.BGroup = new BGroup();
}