雖然Primitive Type號稱有20個,除了對應回程式語言的資料型態不同與Regex不同外,其實他的行為模式是高度一致的。所以,設計一個PrimitiveType<T1, T2>類別來處理所有雜事。
類別定義,用到了泛型。T1是指FHIR的資料型態,當然這些傢伙都是繼承了DataType。T2是指程式語言的資料型態。
這邊宣告了三個屬性。第一個屬性是此Primitive Type的字串型態的值。所有的值都可以被轉換成string。放這個,可以任意轉換成其他資料型態(如果可以轉的話)。
第二個是這個Primitive Type所擁有的Element內容。預設值為null。
第三個是這個Primitive Type所對應程式語言資料型態的值。
這是建構元的部份,其實就是接收外部宣告值來建立此物件的初始值。20個Primitive Type實際上都是交付到這兒來實做。其中protected PrimitiveType(JsonNode? value, string? elementName)這個非常重要。他是用來判斷接受到的JSON內容是單純的value嗎?那簡單就是落實在Primitive原始範疇內。如果不是,給的是物件,那就得交付 InitElementObject((JsonObject)value, elementName)這個私有函數來處理了。(最後說明)
也許最後幾行有點奇怪,不是說_elementValue是放Element嗎?怎麼冒出Id與Extension。別忘了這個類別繼承了DataType,而DataType繼承了Element,所以自然有這兩個欄位。
這兒是複寫遺留自DataType的函數。
因為從這兒開始都是Primitive,所以IsPrimitive()當然要設成true,其他兩個是false。
再來就是ToJsonString,依據JSON的要求,只有String與DateTime資料型態其值需要加引號,其他不用。特別提醒一下,這邊只需要注意Value的部份,至於Key是什麼,就是得看Complex Type或Resource的Element的名稱。
接著就是要實做Interface的部份,列出函數清單提供參考。
最後來說明一下 InitElementObject((JsonObject value, string elementName)這個私有函數,是用來處理Primitive Type卻收到JsonObject內容,那就表示我們拿到了Element。
124:我們要找的element名稱其實是前面有"_"者。
125-128:先把正常的Value先取走。
129-149:取Element的部份。注意,這段程式不會是一開始就能寫的。因為extension欄位的資料型態是Extension,他是屬於Complex Type,都還沒動到那邊。
沒有留言:
張貼留言