"Property reference" 的 class

"Property reference" of the class

在 C++Builder 中是否有对 class 属性 的引用,类似于 C++ 中的常规引用?为了理解我的意思,我将给出代码(到目前为止这是我解决问题的方法):

    void change(TControl* object) {
      struct TAccessor : TControl { __property Text; };
      static_cast<TAccessor*>(object)->Text = L"some text";
    }

此函数允许您更改从 TControl 继承的任何对象的文本 属性。 但也许这个问题有更优雅的解决方案?

您的方法将更新任何 TControlText,即使它实际上并未公开对 Text 的访问(在 [= 中声明为 protected 14=]本身,派生类根据需要决定是否提升为public/__published)。

为了说明这一事实,您必须使用 RTTI 来发现 Text 是否可访问。您还可以使用 RTTI 设置 属性 值,而无需求助于 Accessor 技巧。

例如,old-style RTTI(通过 <TypInfo.hpp> header)仅适用于 __published 属性,没有其他,例如:

#include <TypInfo.hpp>

void change(TControl* object) {
    if (IsPublishedProp(object, _D("Text"))
        SetStrProp(object, _D("Text"), _D("some text"));
}

或者:

#include <TypInfo.hpp>

void change(TControl* object) {
    PPropInfo prop = GetPropInfo(object, _D("Text"), TTypeKinds() << tkUString);
    if (prop)
        SetStrProp(object, prop, _D("some text"));
}

而 newer-style 扩展 RTTI(通过 <Rtti.hpp> header)支持字段、方法和属性,以及所有支持的成员可见性,例如:

#include <Rtti.hpp>

typedef Set<TMemberVisibility, mvPrivate, mvPublished> TMemberVisibilitySet;

void change(TControl* object) {
    static const TMemberVisibilitySet WantedVisibilities = TMemberVisibilitySet() << mvPublic << mvPublished;
    TRttiContext ctx;
    TRttiType *type = ctx.GetType(object->ClassType());
    TRttiProperty* prop = type->GetProperty(_D("Text"));
    if ((prop) && (WantedVisibilities.Contains(prop->Visibility)) && (prop->IsWritable))
        prop->SetValue(object, _D("some text"));
}