代码示例:http://www.tryfsharp.org/create/dutts/Generics.fsx
我在我的F#代码中有一些映射代码,它将一个C#对象包装在一个带标记联合的结构中。
module MyModule =
type MappedThings =
| DoThings of External.Things.DoThings
type MappedStuff =
| DoStuff of External.Stuff.DoStuff
由于我在联合类型中始终使用与外部对象相同的名称,因此我希望尝试使我的映射代码具有可扩展性。到目前为止,这是我尝试过的:
let toDomain<'T> external : 'T =
let found = FSharpType.GetUnionCases(typeof<'T>) |> Seq.where (fun t -> t.Name = external.GetType().Name) |> Seq.head
FSharpValue.MakeUnion(found, [| box external |]) :?> 'T
我正在尝试这样使用它:
let testThings = toDomain<MyModule.MappedThings> doExternalThings
let testStuff = toDomain<MyModule.MappedStuff> doExternalStuff
这对于第一次调用很好用,但如果我尝试将其用于MyModule.MappedStuff类型,则会出现以下错误:
This expression was expected to have type DoThings but here has type DoStuff
我尝试过使用静态解析类型参数,^T,但typeof<^T>报错了。
我在想,如果可以将“Type”(如果这是正确的术语,例如MyModule.Mapped)作为参数传递,那么就能使其工作,但我不知道如何以编程方式获取它。
有人能帮忙吗?
val toDomain:external:obj->'T
),当我将您未声明的值“doExternalThings”和“doExternalStuff”替换为“External.DoThings”和“External.DoStuff”的实际实例时,它按预期工作。 - kaefer