Dan*_*zen 2 extension-methods f#
[<Extension>]
static member ToOrganizationRequest<'T when 'T :> OrganizationRequest> (entity: Entity) =
let request = Activator.CreateInstance(typeof<'T>) :?> OrganizationRequest
request.Parameters.Item "Target" <- entity
request
[<Extension>]
static member ToOrganizationRequest<'T when 'T :> OrganizationRequest> (entities: seq<Entity>) =
entities
|> Seq.map (fun x -> x.ToOrganizationRequest<'T>())
Run Code Online (Sandbox Code Playgroud)
第二种扩展方法无法引用第一种方法,因此
|> Seq.map(有趣的x - > x.ToOrganizationRequest <'T>())
失败,因为我无法使用ToOrganizationRequest.有没有办法让它理解参考?
如果你不需要在C#中看到你的扩展方法,你可以(也可能应该)扩展这样的Entity类型:
type Entity with
member this.ToOrganizationRequest<'T when 'T :> OrganizationRequest>() =
let request = Activator.CreateInstance(typeof<'T>) :?> OrganizationRequest
request.Parameters.Item "Target" <- entity
request
Run Code Online (Sandbox Code Playgroud)
这将允许您的第二个C#样式扩展方法按照您最初编写它的方式运行:
[<Extension>]
type Ext =
[<Extension>]
static member ToOrganizationRequest<'T when 'T :> OrganizationRequest> (entities: seq<Entity>) =
entities
|> Seq.map (fun x -> x.ToOrganizationRequest<'T>())
Run Code Online (Sandbox Code Playgroud)
如果你确实需要在C#中使用它们,则必须在扩展方法定义的类型内静态调用另一个扩展方法.
[<Extension>]
type Ext =
[<Extension>]
static member ToOrganizationRequest<'T when 'T :> OrganizationRequest> (entity: Entity) =
let request = Activator.CreateInstance(typeof<'T>) :?> OrganizationRequest
request.Parameters.Item "Target" <- entity
request
[<Extension>]
static member ToOrganizationRequest<'T when 'T :> OrganizationRequest> (entities: seq<Entity>) =
entities
|> Seq.map (Ext.ToOrganizationRequest)
Run Code Online (Sandbox Code Playgroud)
您可以在此处阅读有关F#文档中各种类型的扩展方法的更多信息.