2011-10-25 28 views
6

這裏是一個片段顯示什麼,我想實現:將<T>類型的值轉換爲Variant,可以嗎?

type 
    TMyObject<T> = class (TObject) 
    function GetVarType(Value: T): TVarType; 
    end; 


function TMyObject<T>.GetVarType(Value: T): TVarType; 
var 
    TmpValue: Variant; 
begin 
    TmpValue := Variant(Value); //Invalid typecast 
    Result := VarType(TmpValue); 
end; 

我知道,與上面的類型轉換是apporach天真,但我希望你的想法。我想用一些轉換機制來取代它。

TMyObject將始終是簡單類型,如Integer,String,Single,Double。

這種轉換的目的是函數VarType爲每個簡單類型提供整型常量,我可以將其存儲在其他地方。

我想知道這樣的轉換是否可能?

謝謝你的時間。

回答

6

您可以使用RTTI得到這個信息,只是檢查TTypeInfo.Kind屬性的值:

入住此示例代碼

{$APPTYPE CONSOLE} 

uses 
    TypInfo, 
    Variants, 
    Generics.Collections, 
    SysUtils; 

type 
    TMyObject<T> = class (TObject) 
    function GetVarType(Value: T): TVarType; 
    end; 


function TMyObject<T>.GetVarType(Value: T): TVarType; 
begin 
    Case PTypeInfo(TypeInfo(T))^.Kind of 
    tkInteger : Result:=varInteger; 
    tkFloat : Result:=varDouble; 
    tkString : Result:=varString; 
    tkUString : Result:=varUString; 
    //add more types here 
    End; 
end; 

Var 
    LObj : TMyObject<Integer>; 
begin 
    try 
    Writeln(VarTypeAsText(TMyObject<Integer>.Create.GetVarType(5))); 
    Writeln(VarTypeAsText(TMyObject<String>.Create.GetVarType('Test'))); 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
    Readln; 
end. 

這將返回

Integer 
UnicodeString 
1

我看不出如何用泛型來做到這一點。編譯器需要知道T類型的實例可以被分配給Variant,以用於任何可能的T。你無法告訴該編譯器可能。

如果這是在C++中的模板,那麼它將是微不足道的。

+0

+1,我渴望C++在Delphi ... –

+0

模板@seth我不知道你是一個德爾菲用戶,我總是把你當成一個花括號的人來幫助你! –

+1

通常但不是唯一的。我使用Delphi作爲C#的本地可執行生成版本(不能不禁止 –

1

謝謝你們爲你的答案:

由於@RRUZ已經表明它是可能的le(我的意思不是嚴格的分配,而是提取數據的類型)。在等待任何答案時,我正在自己工作,並找到了更通用的解決方案。

所以我在這裏並主張它:

type 
    TMyObject<T> = class (TObject) 
    function GetVarType(Value: T): TVarType; 
    end; 


function TMyObject<T>.GetVarType(Value: T): TVarType; 
begin 
    Result := GetTypeData(TypeInfo(T)).varType; 
end; 

再次感謝!

+1

不需要傳遞值,你可以直接從T中讀取這個值。 –

+0

當TypeInfo(T)有任何指示'varType'包含有效值時。善良'是不是'tkDynArray'?或者,存儲在'varType'中的整數實際上是一個'TVarType'值,因爲動態數組可以容納'Variant'不能做的事情?我不認爲這兩個都是真的。 –

+0

@RobKennedy恐怕你說得對。我不明白爲什麼它不能按預期工作。這是一個恥辱...... – Wodzu

7

它可以在Delphis中使用增強的RTTI(2010和更新版本)解決。太糟糕了,你只限於2009年:(

function TMyObject<T>.GetVarType(Value: T): TVarType; 
begin 
    Result := VarType(TValue.From<T>(Value).AsVariant); 
end; 

這僅適用於簡單類型,但是那是在一個問題中指定的約束。

+0

謝謝@gabr當我切換到D2010時,它肯定會有幫助:) – Wodzu

相關問題