Создание дескриптора для свойства класса - PullRequest
0 голосов
/ 01 мая 2010

Можно ли создать дескриптор (или дескриптор отслеживания) для свойства класса? Например,

System::Windows::Forms::CheckBox^ Box = gcnew System::Windows::Forms::CheckBox()

Я бы хотел создать дескриптор свойства Box Checked и использовать его для доступа к нему и его изменения.

1 Ответ

1 голос
/ 01 мая 2010

Свойства - немного больше, чем синтаксический сахар для методов set / get, и, AFAIK, нет никакого способа получить какую-либо ссылку на него (что-то похожее на связанный метод, я полагаю).

Лучший обходной путь, который я могу придумать, который требует VS2010, - это пропустить пару лямбд вокруг:

auto set = [=](bool b) { Box->Checked = b; };
auto get = [=]() -> bool { return Box->Checked; };

РЕДАКТИРОВАТЬ (так как у вас нет VS2010):

Конечно, вы можете вернуться к более барочной конвенции написания специального класса:

public generic<typename T> interface class PropertyProxy
{
    property T Field;
};

public ref class CheckBoxChecked : public PropertyProxy<bool>
{
public:
    CheckBoxChecked(System::Windows::Forms::CheckBox^ box) : _box(box) { }
    property bool Field
    {
        bool get() { return _box->Checked; };
        void set(bool b) { _box->Checked = b; };
    }

private:
    System::Windows::Forms::CheckBox^ _box;
};

Если кто-нибудь спросит вас, для чего хороши лямбды в C ++, этот пример трудно пройти.

...