当存在另一个同名类型时,反思F#模块

当存在另一个同名类型时,反思F#模块,f#,F#,我正在尝试获取模块中函数的MethodInfo:PersistentVector.ofSeq。我遇到的问题是,有一个泛型类型定义为与模块同名:PersistentVector是的,遗憾的是typeof不能将模块作为参数,而只能将其作为类型(尽管在.NET表示中模块是类型)。以下是另一种方法: open Quotations.Patterns let finalMethod = let (Lambda(_,Call(None,m,[_]))) = <@ PersistentVect

我正在尝试获取模块中函数的
MethodInfo
PersistentVector.ofSeq
。我遇到的问题是,有一个泛型类型定义为与模块同名:
PersistentVector是的,遗憾的是
typeof
不能将模块作为参数,而只能将其作为类型(尽管在.NET表示中模块是类型)。以下是另一种方法:

open Quotations.Patterns
let finalMethod = 
    let (Lambda(_,Call(None,m,[_]))) = <@ PersistentVector.ofSeq @>
    m.GetGenericMethodDefinition().MakeGenericMethod(itemType)
...
openquotes.Patterns
让最终方法=
let(Lambda(无,m,[[u]))=
m、 GetGenericMethodDefinition().MakeGenericMethod(itemType)
...
这不仅是一种“替代”方法,而且绝对是一种更好的方法:如果/当此API发生更改时,此代码将在编译时中断,而不是在运行时由于无法解释的NRE而失败。
let methodInfo = typedefof<PersistentVector<_>>.GetMethod("ofSeq")
let pvModuleTypeFullName = "FSharpx.Collections.PersistentVectorModule"
let pvModuleType = Assembly.GetAssembly(typedefof<PersistentVector<_>>).GetType(pvModuleTypeFullName)
let methodInfo = pvModuleType.GetMethod("ofSeq")
let finalMethod = methodInfo.MakeGenericMethod(itemType)
finalMethod.Invoke(...)
open Quotations.Patterns
let finalMethod = 
    let (Lambda(_,Call(None,m,[_]))) = <@ PersistentVector.ofSeq @>
    m.GetGenericMethodDefinition().MakeGenericMethod(itemType)
...