如何访问类的私有属性?

下面以 TPathData 为例,它有一个私有属性 PathData,储存了每一个曲线点,但一般无法修改它,需要利用下面方法,才能访问修改(若有更好的方法,歡迎分享):

一、利用 RTTI 取得类私有属性(建议使用此方法)

type
TPathDataHelper = class helper for TPathData
public
function PathData: TList<TPathPoint>;
end; function TPathDataHelper.PathData: TList<TPathPoint>;
var Context1: TRttiContext;
Type1: TRttiType;
Field1: TRttiField;
begin
Context1 := TRttiContext.Create;
Type1 := Context1.GetType(TPathData);
Field1 := Type1.GetField('FPathData'); if Assigned(Field1) then
Result := Field1.GetValue(Self).AsObject as TList<TPathPoint>
else Result := nil;
end;

参考:http://blog.qdac.cc/?p=2541 (VKHelper,感谢 swish)

二、利用仿类将私有属性改成公有(仿类的成员必需与原类成员位置及顺序相同,因此当版本不同且成员不同时,必需跟着修改)

type
TPathDataHack = class(TInterfacedPersistent)
public
FOnChanged: TNotifyEvent;
FStyleResource: TObject;
FStyleLookup: string;
FStartPoint: TPointF;
FPathData: TList<TPathPoint>;
end; TPathDataHelper = class helper for TPathData
public
function PathData: TList<TPathPoint>;
end; function TPathDataHelper.PathData: TList<TPathPoint>;
begin
Result := TPathDataHack(Self).FPathData;
end;

参考:http://stackoverflow.com/questions/37351215/how-to-access-a-private-field-from-a-class-helper-in-delphi-10-1-berlin

http://www.cnblogs.com/onechen/p/5978083.html

访问类的私有属性(RTTI和模仿类2种方法)的更多相关文章

  1. Java使用PropertyDescriptor获取实体类中私有属性的值,并给私有属性赋值

    大家都知道Java类中的私有的(private)属性是获取不到的(即使使用继承依然获取不到),那如果非要获取私有属性的值怎么办呢?一般的做法是将该java类封装称为一个JavaBean,即封装该私有属 ...

  2. python 类的私有属性和方法 (转载)

    转载:http://www.runoob.com/python/python-object.html 类属性与方法 类的私有属性 __private_attrs:两个下划线开头,声明该属性为私有,不能 ...

  3. Python类的私有属性

    class Bar(object): __age = 18 sex = 'male' def __init__(self, ): pass def f(self): print(self.__age) ...

  4. scala 学习笔记(04) OOP(上)主从构造器/私有属性/伴生对象(单例静态类)/apply方法/嵌套类

    一.主从构造器 java中构造函数没有主.从之分,只有构造器重载,但在scala中,每个类都有一个主构造器,在定义class时,如果啥也没写,默认有一个xxx()的主构造器 class Person ...

  5. Python全栈--9.1--面向对象进阶-super 类对象成员--类属性- 私有属性 查找源码类对象步骤 类特殊成员 isinstance issubclass 异常处理

    上一篇文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象 ...

  6. python基础===类的私有属性(伪私有)

    说在前面的一点: python明明有私有的定义方法就是在变量或者方法的面前加上双下滑线__,这个实际上是python的伪私有.只是一种程序员约定俗称的规定,加了就表示私有变量,但是你如果要在外部调用的 ...

  7. python 基础 5.4 类的私有属性和私有方法

    一. 类的私有变量和私有方法 1>   在python 中可以通过在属性变量名前,加上双下划线定义属性为私有属性   2>特殊变量命名 a. _xx 以单下划线开头的表示的是protect ...

  8. Python 类的私有属性与私有方法

    1.隐藏的使用场景 在Python类中,有些属性和方法只希望在对象的内部被使用,而不希望在外部被访问到, 2.定义方式, 在属性名或方法名前增加两个下划线,定义的就是私有属性或方法 #其实这仅仅这是一 ...

  9. python基础-9.1 面向对象进阶 super 类对象成员 类属性 私有属性 查找源码类对象步骤 类特殊成员 isinstance issubclass 异常处理

    上一篇文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象 ...

随机推荐

  1. activity-alias详解及应用

    activity-alias标签元素众所周知,AndroidManifest是一个xml文件,它包含很多标签元素,如application.activity.receiver等,其中有一个叫做acti ...

  2. RStudio 的使用

    0. 基本 路径查看和设置: getwd() ⇒ 查看路径 setwd() ⇒ 设置路径: 1. 快捷键 ctrl+shift+c:多行注释:选中待注释的代码段,按下 ctrl+shift+c(c 表 ...

  3. 利用WPF建立自己的3d gis软件(非axhost方式)(十二)SDK中的导航系统

    原文:利用WPF建立自己的3d gis软件(非axhost方式)(十二)SDK中的导航系统 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bPew ...

  4. 读取Jar包外面的配置文件

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/shenxiandashu/article/details/79193705 比较常用的方法是将pro ...

  5. 处理EasyUI中tab的切换问题以及accordion左侧导航栏的代码实现

    //左侧导航菜单 function leftMenus() { //$(".easyui-accordion").empty(); $.each(_menus.menus, fun ...

  6. javascript 中英文字符长度和截断处理

    因:javascript中的String类自带的length属性 和 substr()方法虽然能判断和截取出字符个数,但是对字节个数却没有处理的方法(众所周知,中文字符占两个字节,英文只占一个) 果: ...

  7. WPF 3D变换应用

    WPF可以提供的3D模型使我们可以轻松地创建3D实体,虽然目前来看还很有一些性能上的问题,不过对于一些简单的3D应用应该是可取的,毕竟其开发效率高,而且也容易上手. 下面给大家演示的是使用在WPF 3 ...

  8. UVA 548(二进制重建和遍历)

    J - Tree Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Ap ...

  9. 使用WPF将图片转变为灰度并加上水印并保存为文件

    原文:使用WPF将图片转变为灰度并加上水印并保存为文件 运行效果: (上图中左下角为原图的缩小显示,By:Johnson为TextBlock)保存的结果图片:上图的"Test Words.& ...

  10. Open SSL 开发环境配置

    Open SSL 开发环境配置 最后更新日期:2014-05-13 阅读前提:VisualStudio的基本使用.Cent OS的基本使用 环境: Windows 8.1 64bit英文版,Visua ...