在 Java 中,我们有类似 VarName.toString
的东西来确定 var 的名称。
我在 Delphi 中有一段代码,我需要实现同样的目标,因为我有一个 record
类型,它有许多我需要识别的子字符串:
type
THierarchyAccess = String; // receive the user permissions from the MySQL DB
THierarchy = record
MOD_HIERARQUIA : THierarchyAccess; // 'BROWSE_ONLY', 'MANAGE', 'NONE'...
MOD_OPERADORES : THierarchyAccess;
MOD_ESTATISTICAS : THierarchyAccess;
MOD_AUDITORIA : THierarchyAccess;
MOD_HOMEPAGE : THierarchyAccess;
MOD_HOTSITES : THierarchyAccess;
MOD_MATRIZ : THierarchyAccess;
MOD_NOTICIAS : THierarchyAccess;
MOD_VISITANTES : THierarchyAccess;
...
end;
...
function TAccess.IsAccessPermited(apNeed, apHave: String): Boolean;
begin
// HERE I need to know not only the content of "apHave",
// but if it came from THierarchy.MOD_HOTSITES or THierarchy.MOD_MATRIZ etc.
end;
...
if IsAccessPermited('BROWSE_ONLY', MyHierarchy.MOD_HOTSITES) then Form2.Open;
有没有一种优雅的方法来识别传递给函数的变量名是什么?
最佳答案
一般来说,诸如记录字段名称或参数变量名称之类的符号名称不会被 native 代码编译器(例如Delphi)包含在可执行镜像中,因为 native 机器指令只关心偏移量和地址,而不关心名称。这就是为什么 Delphi 生成的 exe 比同等的 .NET 或 Java 应用程序小数百倍的原因之一。
但是,类型元数据(例如字段名称)对于“自给自足”的对象流非常有用。这种类型元数据通常被 native 代码编译器称为运行时类型信息 (RTTI)。
您可以尝试在类型声明周围启用 {$M+}
来编译上面的类型。请务必在之后立即设置 {$M-}
以避免使用不需要的类型名称使您的 exe 膨胀。
然后您将需要使用 Delphi RTTI 方法来访问记录结构的字段名称。
但是,我认为这不适用于您的示例代码,因为您将记录字段作为参数传递给另一个函数。要获取记录的第 n 个字段的名称,您需要记录类型。
您的 IsAccessPermission()
函数仅接收记录字段内容的值。它不知道使用哪个字段来传递值,甚至不知道是否使用了记录
关于delphi - 如何获取delphi函数中参数传递的变量或对象节点的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11302001/