在Delphi中是否可以使用RTTI(或其他东西)来检查类是否被声明为抽象?就像是:
TMyAbstractClass = class abstract(TObject)
// ...
end;
...
if IsAbstract(TMyAbstractClass.ClassInfo) then
ShowMessage('Yeah')
else
ShowMessage('Computer says no...');
Run Code Online (Sandbox Code Playgroud) 首先,为我的英语道歉,我希望我在这里写的是有道理的.现在我的问题.
如何使用TypInfo.GetEnumName()获取Variant 的内容类型的字符串表示形式.我试过以下,没有运气,我得到一个数字表示.
myString := GetEnumName( TypeInfo(TVarType), TVarData(myVar).VType );
Run Code Online (Sandbox Code Playgroud)
谢谢.
我已经证明我可以使用Delphi 2010从其GUID获取接口的名称(例如,IMyInterface转换为字符串'IMyInterface'.我想在Delphi 7中实现这一点(兼容性).这可能吗?或者是有基本的编译限制.
没有人知道的方式在C正确处理双调度++ 而不使用RTTI和dynamic_cast的<>,并且也是溶液,其中,所述类层次是可扩展的,即基类可以从进一步得到,它的定义/实施不需要知道的吗?
我怀疑没有办法,但我很高兴被证明是错的:)
我有RTTI TRttiMethod.Invoke,stdcall和const参数的问题:
obj := TClassRecordTest.Create;
try
b.a := 10; b.b := 100;
a.a := 1; a.b := 2;
writeln('b.a='+IntToStr(b.a)+' b.b='+IntToStr(b.b));
writeln;
writeln('call test1');
writeln('a.a='+IntToStr(a.a)+' a.b='+IntToStr(a.b));
r := VToRec(RTTICall(obj, 'Test1', @a, @b));
writeln('test1 r.a='+IntToStr(r.a)+' r.b='+IntToStr(r.b));
a.a := 2; a.b := 3;
writeln('call test2');
writeln('a.a='+IntToStr(a.a)+' a.b='+IntToStr(a.b));
r := VToRec(RTTICall(obj, 'Test2', @a, @b));
writeln('test3 r.a='+IntToStr(r.a)+' r.b='+IntToStr(r.b));
a.a := 3; a.b := 4;
writeln('call test3');
writeln('a.a='+IntToStr(a.a)+' a.b='+IntToStr(a.b));
r := VToRec(RTTICall(obj, 'Test3', @a, @b));
writeln('test3 r.a='+IntToStr(r.a)+' r.b='+IntToStr(r.b));
a.a := 4; a.b := 5;
writeln('call test4'); …Run Code Online (Sandbox Code Playgroud) 让我们说我有一个示例类助手
TSampleClassHelper = class helper for TSampleClass
public
procedure SomeHelper;
end;
Run Code Online (Sandbox Code Playgroud)
我做以下事情:
var
obj :TSampleClass;
begin
obj:=TSampleClass.Create;
obj.SomeHelper;
end;
Run Code Online (Sandbox Code Playgroud)
这按预期工作.
但是,如何使用RTTI来调用辅助方法呢?以下似乎不起作用,GetMethod返回nil.
var
obj :TSampleClass;
ctx :TRTTIContext;
rtype :TRTTIType;
rmethod :TRTTIMethod;
begin
obj:=TSampleClass.Create;
rtype:=ctx.GetType(obj.ClassType);
rmethod:=rtype.GetMethod('SomeHelper'); // rmethod is nil !
end;
Run Code Online (Sandbox Code Playgroud)
那么RTTI不适用于类助手中定义的方法吗?有没有办法解决?
谢谢.
我无法在任何地方找到这个看似简单的问题的答案.
以下C++函数是否使用RTTI?它当然不必,但我想知道是否有保证在编译时确定typeid.
template <typename T>
const char *getName()
{
return typeid(T).name(); // Resolved at compile time?
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用RTTI使用Text-property来概括可视组件的内容验证,但是当我尝试将字符串值传递给TRttiMethod.Invoke时,我收到消息"Invalid Typecast".(实际上是"UngültigeTypumwandlung",但我猜,这是一个合适的翻译.)
假设所有传递的对象都是完美的,下面的代码将被删除所有安全措施,断言等.
procedure ValidateTextFieldAndSetFocus(const Field: TObject; const Validator: TObject; const errorStates: array of TStringValidationResult; const sErrorMessage: string);
var
context : TRttiContext;
objField : TRttiType;
objValid : TRttiType;
prop : TRttiProperty;
execute : TRttiMethod;
I : Integer;
validResult : TStringValidationResult;
value : TValue;
begin
context := TRttiContext.Create;
objField := context.GetType(Field.ClassInfo);
objValid := context.GetType(Validator.ClassInfo);
prop := objField.GetProperty('Text');
value := prop.GetValue(Field);
execute := objValid.GetMethod('Execute');
for I := 0 to High(errorStates) do
if execute.Invoke(Validator,[value]).TryAsType<TStringValidationResult>(validResult) then
if validResult = errorStates[I] then
begin
SetFocusIfCan(Field);
raise …Run Code Online (Sandbox Code Playgroud) 我正在尝试获取记录字段的类型以创建正确的比较器(作为任何/几乎任何记录类型的通用解决方案).我找不到静态数组的类型信息:
TArrFieldTest = record
a: string;
b: array[0..3] of byte;
end;
procedure Test;
var
rttiContext: TRttiContext;
rttiType: TRttiType;
rttiFields: TArray<TRttiField>;
begin
rttiType := rttiContext.GetType(TypeInfo(TArrFieldTest));
rttiFields := rttiType.GetFields;
Assert(rttiFields[0].FieldType<>nil); // it's ok
Assert(rttiFields[1].FieldType<>nil); // fail here!
end;
Run Code Online (Sandbox Code Playgroud)
对于任何类型的静态数组,FieldType都是nil.任何想法在这里有什么不对?或者也许有更简单的方法来创建与TArray/TDictionary等一起使用的记录的比较器?
我试图像这样使用RTTI获取变量名.
这是我的测试.
type
TStringHelper = record helper for string
function Name: string;
end;
TMyRecord = record
Field1:string;
end;
implementation
{ TStringHelper }
function TStringHelper.Name: string;
var
context : TRttiContext;
begin
context := TRttiContext.Create;
result := context.GetType(@Self).Name; // return empty
context.Free;
end;
procedure TForm2.FormCreate(Sender: TObject);
var
r : TMyRecord;
begin
ShowMessage(r.Field1.Name);
end;
Run Code Online (Sandbox Code Playgroud)
TRttiType返回的名称为空.
有没有办法得到变量名?
rtti ×10
delphi ×8
c++ ×2
delphi-2009 ×1
delphi-xe ×1
delphi-xe3 ×1
interface ×1
overloading ×1
polymorphism ×1
templates ×1
typeinfo ×1