您不能使用?
運營商訪問模塊中的功能,因爲結構Checks?test1
在語法上不正確的(這將被轉換爲(?) Checks "test"
,你不能用模塊名作爲值) 。
但是,應該可以對使用對象實例的類型成員(例如obj?test
)執行此操作。或者,您可以編寫一個「假」對象實例(知道模塊的名稱)。然後,?
的實現將查找模塊並搜索模塊中的靜態成員。
(第一種情況)的最簡單的實現應該是這樣的:
let (?) obj s =
let memb = obj.GetType().GetMethod(s)
// Return name and a function that runs the method
s, (fun args -> memb.Invoke(obj, args))
// Type that contains tests as members
type Check() =
member x.test1() = 32
// We need to create instance in order to use '?'
let ch = Check()
let s,f = ch?test1
// Function 'f' takes array of objects as an argument and
// returns object, so the call is not as elegant as it could be
let n = ((f [| |]) :?> int)
你也可以添加一些包裝,以使函數f的一點點更好,但我希望這表明了想法。不幸的是,這不能用於模塊。