Delphi 当方法将索引枚举作为参数时,TRttiMethod.GetParameters()不起作用

Delphi 当方法将索引枚举作为参数时,TRttiMethod.GetParameters()不起作用,delphi,rtti,Delphi,Rtti,我使用的是Delphi10.1柏林更新2。以下是重现问题的代码: 使用 System.SysUtils, Rtti; 类型 TEnum=(t1,t2); TIndexedEnum=(to1=1,to2); TClass1=class 构造函数创建(pEnum:TEnum); 结束; TClass2=类 构造函数创建(pEnum:TIndexedEnum); 结束; 构造函数TClass1.Create(pEnum:TEnum); 开始 结束; 构造函数TClass2.Create(pEnum:T

我使用的是Delphi10.1柏林更新2。以下是重现问题的代码:

使用
System.SysUtils,
Rtti;
类型
TEnum=(t1,t2);
TIndexedEnum=(to1=1,to2);
TClass1=class
构造函数创建(pEnum:TEnum);
结束;
TClass2=类
构造函数创建(pEnum:TIndexedEnum);
结束;
构造函数TClass1.Create(pEnum:TEnum);
开始
结束;
构造函数TClass2.Create(pEnum:TIndexedEnum);
开始
结束;
函数MethodParamCount(pMethodName:String;pClass:TClass):整数;
变量
rContext:trtti上下文;
rType:trttype;
方法:焦油;
I:整数;
开始
rContext:=TRttiContext.Create;
rType:=rContext.GetType(pClass);
FMethods:=rType.GetMethods;
对于I:=低(FMethods)到高(FMethods)do
如果是SameText(pMethodName,FMethods[I].Name),那么
开始
结果:=长度(FMethods[I].GetParameters);
出口
结束;
结果:=-1;
结束;
开始
WriteLn(IntToStr(MethodParamCount('Create',TClass1));//印刷品1
WriteLn(IntToStr(MethodParamCount('Create',TClass2));//打印0
ReadLn;
结束。
这是RTTI实现的一个bug,还是我遗漏了什么?有没有办法在不改变类实现的情况下绕过这个问题


编辑:我想找到一个没有任何参数的构造函数,这样我就可以使用
Invoke()
调用它。问题是,RTTI告诉我,对于一个实际有参数的方法,没有参数

可能与以下事实有关,即不以0开头和/或不连续的枚举没有RTTIrelated:“此示例适用于RTTI类型和单字节非RTTI枚举类型-您需要扩展它以支持更大的枚举类型。”-事实上,由于枚举的大小不限于1字节,根据使用的值和编译器设置,它们的大小可以达到4个字节。@MarceloRauter:我知道你说过你不想更改类的实现,但是添加一个如何(仅在你没有得到RTTI的情况下)对于类,告诉您必须使用什么类型的枚举才能通过RTTI调用正确创建类?@MarceloRauter“我想找到一个没有任何参数的构造函数”-以及一个具有1个或多个参数且所有参数都具有默认值的构造函数如何?这也被认为是“默认构造函数”。任何不必向其传递显式参数值的构造函数都是“默认构造函数”,这可能与以下事实有关:不以0开头和/或不连续的枚举没有RTT相关:“此示例适用于RTTI类型和单字节非RTTI枚举类型,您需要对其进行扩展以支持更大的枚举类型。“-事实上,由于枚举的大小不限于1个字节,根据使用的值和编译器设置,它们最多可以有4个字节。@MarceloRauter:我知道你说过你不想更改类的实现,但是添加一个如何(仅在你没有得到RTTI的情况下)对于类,告诉您必须使用什么类型的枚举才能通过RTTI调用正确创建类?@MarceloRauter“我想找到一个没有任何参数的构造函数”-以及一个具有1个或多个参数且所有参数都具有默认值的构造函数如何?这也被认为是“默认构造函数”。任何不必传递显式参数值的构造函数都是“默认构造函数”