2016-05-20 4 views
1

У меня есть заводская фабрика. Я хочу получить имя типа и его значение в виде строки, например:Имя и стоимость общего типа

Перечисление TTV со значением Samsung вернет 'TTV.Samsung'.

Строка со значением 'stackoverflow' вернет 'string.stackoverflow'.

Целое число со значением 10 вернет 'integer.10'.

A TValue от TTV.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, вы можете использовать RTTI того типа, который удерживает TValue.

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. 

 Смежные вопросы

  • Нет связанных вопросов^_^