Получил проблему где MyObj.classnameis(TMyClass.classname)
верно и TMyClass(MyObj)
работы, но (MyObj as TMyclass).doSomething
бросает ошибку преобразования.
Я действительно не хочу справки с тем спамом, хотя, если бы Вы хотите поместить его в комментарии, это было бы супер. Я просто хотел бы знать что различие между Obj as Class
и Class(Obj)
.
As-cast проверяет реальный тип объекта, чтобы убедиться, что приведение действительно, и вызывает исключение, если это не так. При "жестком приводе" (TMyClass(MyObj)
style) проверка не производится, он просто говорит компилятору, что приведение действительно.
Если у вас есть ситуация, когда ClassNameIs возвращает true, но as-cast не работает, это означает, что у вас есть два разных класса в двух разных единицах с одинаковым именем, и as-cast пытается привести к неправильному классу. Это также означает, что жесткая привязка выполняется к неправильному классу, что потенциально может привести к повреждению памяти.
Выполните полный поиск проекта по "TMyclass =", чтобы увидеть, где у вас несколько объявлений, и либо переименуйте один из классов, либо используйте полное определение (obj как MyUnit.TMyClass), чтобы компилятор знал, к какому классу вы пытаетесь привести.
Дополнение к сообщению Мэйсона: Вместо поиска по вашему коду вы также можете вызвать метод, подобный этому, в том месте, которое дает ты проблема.
function GetClassInheritance(Obj : TObject) : string;
var ClassRef : TClass;
begin
Result := '';
ClassRef := obj.ClassType;
Result := ClassRef.ClassName;
ClassRef := ClassRef.ClassParent;
while assigned(ClassRef) do
begin
Result := ClassRef.ClassName + '.' + Result;
ClassRef := ClassRef.ClassParent;
end;
Result := '(' + obj.ClassType.UnitName + ')' + Result
end;
Это вернет вам строку в формате (UnitName) TObject.TPersistent.TComponent .... Я не помню, чтобы видел "ClassType.UnitName" в старой версии delphi, поэтому эта часть может не работать с ними, а остальные должны.