我有一个Delphi 6类对象,它包含一个包含30个变量的数组,每个变量都通过不同的索引属性公开。例如:
property responseCode: integer
Index 7 read getIndexedProperty_integer write setIndexedProperty_integer;
我这样做是为了更容易使用Variants数组(帮助IDE自动完成)并提供类型安全性。它工作正常,但现在我有一个皱纹。当构造包装它的类时,Variants数组被初始化为NULL,因此我可以判断某个特定变体是否曾使用值进行实例化。这样做的结果是,如果只实例化了一些变量(给定有效值),当Delphi尝试将变量转换为由变量声明的类型时,任何访问当前表示NULL变体的属性的尝试都将导致变体转换错误。索引属性。
我宁愿不为每个索引属性声明一个“isValid”属性。我想知道是否有办法使用TypeInfo库来获取基础Variant的原始值,而无需直接访问索引属性,从而触发转换异常。然后我可以编写代码(使用上面的示例属性):
isValidProperty(responseCode);
如果responseCode属性的Variant不是NULL,那么该函数将返回TRUE,如果是,则返回FALSE。
我知道我可以遍历类的PPropList属性列表并按名称访问属性,但是我必须使用如下代码:
isValidProperty('responseCode');
并以字符串形式传递属性名称,而不是直接传递属性,就像上面的第一个isValidProperty()一样。有没有办法做到这一点?
答案 0 :(得分:1)
因此,您希望“获取基础Variant的原始值,而无需直接访问索引属性,从而触发转换异常”。只要您可以访问基础Variant本身,是的,您可以。您最有可能需要更改容器类。
来自the Delphi XE2 help page on variant types:
标准函数
VarType
返回变体的类型代码。该varTypeMask
常量是用于从中提取代码的位掩码VarType
的返回值,例如,
VarType(V) and varTypeMask = varDouble
如果True
包含V
或者Double
,则返回
array of Double
TVarData
。 (掩码只隐藏第一位,表示 变量是否包含数组。)定义了System
记录类型 在{{1}}单元中可以用于类型变换并获得访问权限 他们的内部代表。
您应该能够使用此处提到的方法和记录的组合来查找有关变体内部数据的任何内容,包括它是否为NULL变体,以及直接访问它。
(这个系统对我来说似乎有点狡猾的设计:它似乎不是一个非常类型安全的实现...请参阅上面的评论。我认为基于您期望的实际值类型的设计可能更安全。但是,这将让您实现目标。)