2011-06-17 74 views
0

給定的類: 使用 InvokeRegistry; //定義TRemotable的地方。
型 TMyLabel = A類(TRemotable) //一些出版道具 TMySubLabel = A類(TMyLabel) //更多發表道具將類字符串轉換爲TClass

//some other classes descendent of TMyLabel. 

    TMyLabelClass = class of TMyLabel; 

我的要求是實現:

function StringToClass(string aClassName): TClass; 
begin 
    //your implementation goes here 
end; 

用法:

function GetMyLabelInstance(string aClassName):TMyLabel; 
var 
    lCloned: TMyLabel; 
begin 
    Tclass lClass = StringToClass('TMySubLabel'); 
    lCloned := TMyLabelClass(lClass).Create; 
end; 

我正在使用Delp喜7和我的對象不是從TPersistent派生,因此該解決方案並不適用於我的情況: How to convert classname as string to a class?

感謝,

+2

[TOndrej接受的答案](http://stackoverflow.com/questions/2727654/how-to-convert-classname-as-string-to-a-class/2727962#2727962)到你鏈接的問題沒有對該類作出'TPersistent'的任何假設,它可以與你添加到'TStringList'的任何東西一起工作。 – 2011-06-17 07:16:55

+1

'Tclass lClass = StringToClass('TMySubLabel');'對我來說看起來有點C-ish。這是一種可接受的語法(Delphi的一些變體)還是隻是一個僞代碼? – 2011-06-17 08:32:58

+0

@Andriy,它是僞代碼。 – Johan 2011-06-17 09:15:05

回答

1

當你的類不是TPersistent後裔,你必須實現自己的RegisterClass/FindClass程序。

我通常通過在TStringList(或TDictionary<string, TClass>,適用於較新的Delphi版本)中註冊類名來完成此操作,如TOndrej's answer中所述。我在定義該類的單元的initialization部分進行註冊。

然後,您可以使用FindClass函數根據名稱或直接根據類的名稱創建實例的正確類的工廠過程來檢索類。

我還考慮一個很好的做法,將TStringList,註冊程序和工廠程序打包在一個類中實現爲單例。

如果你想作爲一個工廠,你也有一個虛擬的構造函數添加到基類(TMyLabel),並定義元類型TMyLabelClass = class of TMyLabel,並投了StringList.Objects [一] TMyLabelClass而不是TClass

使用
+0

答案是:function StringToClass(s​​tring aClassName):TClass;開始var lXSClass:TClass;開始lXSClass:= RemClassRegistry.URIToClass('myUri',aClassName);結果:= TMyLabelClass(lXSClass).Create;結束; \ r \ n解釋: 我的所有類都是TRemotable的後代(在InvokeRegistry中定義) InvokeRegistry包含RemClassRegistry.URIToClass方法,該方法通過RemClassRegistry.RegisterXSClass讀取與其關聯的TClass值 – 2011-06-20 23:47:40