2011-10-25 6 views
6

は私が達成しようとしているものを示すスニペットです:タイプ<T>の値をバリアントに変換することは可能ですか?ここ

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

あなただけTTypeInfo.Kindプロパティの値を確認し、この情報を取得するためにRTTIを使用することができます。

チェックこのサンプルコード

{$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に割り当てることができることを知る必要があります。コンパイラに可能なことを伝える方法はありません。

これがC++のようなテンプレートであれば、それは簡単です。

+0

+1、私は、DelphiでのC++のテンプレートの長い間... –

+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'ではなく?動的配列は 'Variant'ができないものを保持できるので、' varType'に格納された整数は実際に 'TVarType'値です。どちらも必ずしも真実ではないと思う。 –

+0

@RobKennedyあなたが正しいことを恐れています。私はそれが期待どおりに機能していない理由は分かりません。それは残念です... – Wodzu

7

デルファイではRTTIが強化されています(2010以降)。あなたが2009に制限されている:(

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

これは、単純型に対してのみ機能しますが、それは問題で指定された制約だったのが残念。

+0

ありがとう@ gabr私はD2010に切り替えると間違いなく役に立ちます:) – Wodzu

関連する問題