2016-05-20 5 views
1

私はGenericファクトリーを持っています。型名とその値を文字列として取得したいとします。汎用タイプの名前と値

列挙型TTVの値がSamsungの場合、'TTV.Samsung'が返されます。

値が'stackoverflow'の文字列は、'string.stackoverflow'を返します。

10の値を持つ整数は、'integer.10'を返します。

TValueTTV.Samsung(例えば、TValue.From(TTV.Samsung))は、'TTV.Samsung'を返します。ここで

は私の関数の宣言です:

function TGenericFactory<TKey>.GetTypeString(Key: TKey): string; 

は、どのように私はこの仕事をするのですか?

+0

は日常的です。あなたはrttiについて何か知っていますか?なぜrttiについて学ぶことで始めませんか?あなたが最も基礎的な研究をしたとしても、これを行う方法を知っているでしょう。 –

答えて

1

TValueはあなたのために、この作業の大部分を処理ToString()方法を持っているので、あなたの関数が任意の入力値から一時TValueを作成しており、その後にかかわらず、実際にそれを入力する内容の文字列に値を変換するためにTValue.ToString()を使用することができますです。 RTTIを使用して、入力値のタイプ名を取得できます。入力値がTValueの場合は、TValueが保持しているタイプのRTTIを使用できます。ここで

uses 
    System.Rtti; 

type 
    TGenericFactory<TKey> = class 
    public 
    class function GetTypeString(Key: TKey): string; 
    end; 

function TValueToString(const V: TValue): string; inline; 
begin 
    Result := String(V.TypeInfo.Name) + '.' + V.ToString; 
end; 

class function TGenericFactory<TKey>.GetTypeString(Key: TKey): string; 
type 
    PTValue = ^TValue; 
begin 
    if TypeInfo(TKey) = TypeInfo(TValue) then 
    Result := TValueToString(PTValue(@Key)^) 
    else 
    Result := TValueToString(TValue.From<TKey>(Key)); 
end; 

結果は以下のとおりです。タイプの名前を取得

type 
    TTV = (Nokia, Samsung, Motorola); 

var 
    S: String; 
begin 
    S := TGenericFactory<TTV>.GetTypeString(TTV.Samsung); 
    // returns 'TTV.Samsung' 

    S := TGenericFactory<String>.GetTypeString('stackoverflow'); 
    // returns 'string.stackoverflow' 

    S := TGenericFactory<Integer>.GetTypeString(10); 
    // returns 'Integer.stackoverflow' 

    S := TGenericFactory<TValue>.GetTypeString(TValue.From(TTV.Samsung)); 
    // returns 'TTV.Samsung' 
end. 
関連する問題