作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用TRttiProperty.SetValue
过程通过rtti分配一个对象过程
类型的属性,但是当我尝试制作时会引发此异常赋值EInvalidCast:无效的类类型转换
此示例应用程序显示了问题
{$APPTYPE CONSOLE}
uses
Rtti,
SysUtils;
type
TMyCallBack = procedure (const Foo : string) of object;
TMyClass = class
procedure DoSomething(const Foo: String);
end;
TMyAnotherClass = class
private
FDoSomething: TMyCallBack;
published
property DoSomething : TMyCallBack read FDoSomething Write FDoSomething;
end;
{ TMyClass }
procedure TMyClass.DoSomething(const Foo: String);
begin
Writeln('Hello');
end;
Var
MyClass : TMyClass;
t : TRttiInstanceType;
v : TValue;
p : TRttiProperty;
Bar : TMyCallBack;
begin
try
MyClass:=TMyClass.Create;
try
t:=TRttiContext.Create.GetType(TMyAnotherClass).AsInstance;
v:=t.GetMethod('Create').Invoke(t.MetaclassType,[]);
p:=t.GetProperty('DoSomething');
Bar:=MyClass.DoSomething;
if p<>nil then
p.SetValue(v.AsObject, @Bar); //here the exception is raised
finally
MyClass.Free;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
如何解决这个问题?
最佳答案
当我追踪到错误行时,我最终发现了隐式 TClass->TValue 转换例程。看起来 @Bar 是一个指针,编译器隐式地将其转换为 TClass,从那里开始一切都变得一团糟。这不是你想要的。
您需要的是一个类型和值与 Bar 匹配的实际 TValue。试试这个:
Var
MyClass : TMyClass;
t : TRttiInstanceType;
v : TValue;
p : TRttiProperty;
Bar : TMyCallBack;
vBar : TValue;
begin
try
MyClass:=TMyClass.Create;
try
t:=TRttiContext.Create.GetType(TMyAnotherClass).AsInstance;
v:=t.GetMethod('Create').Invoke(t.MetaclassType,[]);
p:=t.GetProperty('DoSomething');
Bar:=MyClass.DoSomething;
vBar := TValue.From<TMyCallback>(bar);
if p<>nil then
p.SetValue(v.AsObject, vBar); //here the exception is raised
finally
MyClass.Free;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
关于delphi - 通过 TRttiProperty.SetValue 分配对象过程时会引发 EInvalidCast 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10150551/
我创建了一个分支来开发新功能。由于这个新功能完全是作为一个新项目开发的,唯一可能的冲突来源是解决方案文件。 随着功能的开发,主分支更新了几次。当我完成开发和测试时,我做了: git checkout
我是一名优秀的程序员,十分优秀!