"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 继承的任何对象的文本 属性。
但也许这个问题有更优雅的解决方案?
您的方法将更新任何 TControl
的 Text
,即使它实际上并未公开对 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"));
}
在 C++Builder 中是否有对 class 属性 的引用,类似于 C++ 中的常规引用?为了理解我的意思,我将给出代码(到目前为止这是我解决问题的方法):
void change(TControl* object) {
struct TAccessor : TControl { __property Text; };
static_cast<TAccessor*>(object)->Text = L"some text";
}
此函数允许您更改从 TControl 继承的任何对象的文本 属性。 但也许这个问题有更优雅的解决方案?
您的方法将更新任何 TControl
的 Text
,即使它实际上并未公开对 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"));
}