簡體   English   中英

如何在 Delphi 中將特定類型的變量轉換為泛型 T?

[英]How to cast a variable of specific type to generic T in Delphi?

根據T的實際類型,我想返回一個特定的值; 這是一個簡化的示例(圍繞某個對象的記錄包裝器):

function TMyRec.TryGet<T>(const Default: T): T;
begin
  if TypeInfo(T) = TypeInfo(TMyObject) then
    Result:= FMyObject {E2010 Incompatible types}
  else Result:= FMyObject.TryGet<T>(Default);
end;

很明顯,我不能將T以外的任何東西分配給Result ,並且as TT()不起作用,當T不限於class ......

也無法執行僅在通用限制方面不同的重載:

function TryGet<T: TMyObject>(const Default: T): T; overload;
{...}
Result:= FMyObject as T; {here it would work}

為了幫助理解下面評論中的討論,以下是我編輯之前的示例:

function TMyRec.TryGet<T>(const Default: T): T;
begin
  if TypeInfo(T) = TypeInfo(TMyObject) then Result:= FMyObject
  //else ...
  else Result:= Default;
end;

我相信這是實現您想要的最佳方法(至少在性能方面)。

type 
  PMyObject = ^TMyObject;

function TMyRec.TryGet<T>(const Default: T): T;
begin
  if TypeInfo(T) = TypeInfo(TMyObject) then 
    PMyObject(@Result)^ := FMyObject
  else if TypeInfo(T) = TypeInfo(Integer) then 
    PInteger(@Result)^ := 1
  //else ...
  else
    Result := Default;
end;

我發現的唯一方法是使用System.Rtti.TValue (如果類型錯誤則例外):

Result:= TValue.From(FMyObject).AsType<T>

或更短的 ;-) 自動類型(如果類型錯誤,則返回 false;您可以在此處忽略它,因為您已經檢查了 TypeInfo):

TValue.From(FMyObject).TryAsType(Result)

建議:重新思考你的概念; 有人擔心泛型可能不是一個好的解決方案,但我們無法在不了解更多背景的情況下判斷。

我正在使用 Delphi XE5。

將 yoru 示例更改為:

function TryGet<T: class>(const Default: T): T; overload;
{...}
Result:= FMyObject as T; {here it will work}

更改是TMyObjectclass 當你沒有“類”它時,你會得到編譯器錯誤 E2089。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM