2017-03-01 3 views
2
[<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>()) 

Die zweite Extension nicht in der Lage ist, die ersten zu verweisen, soF # Eine Erweiterung Methode Referenz andere

|> Seq.map (fun x -> x.ToOrganizationRequest < ‚T>())

schlägt fehl, da ich ToOrganizationRequest nicht verwenden kann. Gibt es eine Möglichkeit, die Referenz zu verstehen?

+5

statische Mitglieder sind verfügbar von 'TypeName.StaticMember', also versuchen Sie, das anstelle von' this.StaticMember' zu verwenden –

+0

Was meinst du? Das sollte ich in der Lage sein, etwas wie Entity.ToOrganizationRequest <'T> zu tun? Weil ich das nicht kann. –

Antwort

7

Wenn Sie nicht Ihre Erweiterungsmethode müssen sichtbar in C# sein, können Sie (und wahrscheinlich sollte) erweitern den Entity Typ wie diese statt:

type Entity with 
    member this.ToOrganizationRequest<'T when 'T :> OrganizationRequest>() = 
     let request = Activator.CreateInstance(typeof<'T>) :?> OrganizationRequest 
     request.Parameters.Item "Target" <- entity 
     request 

Dies wird Ihre zweite C# Stil Erweiterungsmethode erlauben funktionieren, wie Sie es ursprünglich geschrieben:

[<Extension>] 
type Ext = 
    [<Extension>] 
    static member ToOrganizationRequest<'T when 'T :> OrganizationRequest> (entities: seq<Entity>) = 
     entities 
     |> Seq.map (fun x -> x.ToOrganizationRequest<'T>()) 

Wenn Sie sie in C# tun müssen, werden Sie rufen müssen, um die andere Erweiterungsmethode statisch innerhalb der Art, dass die Erweiterungsmethoden definiert innerhalb.

[<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) 

Sie können mehr über die verschiedenen Arten von Erweiterungsmethoden in der F # Dokumentation here lesen.

+0

Ich rufe den Code von C#. Perfekt arbeiten, vielen Dank! –

+2

Eigentlich @TheInnerLight F # -Stil Erweiterung Methoden werden nicht für die zweite Methode arbeiten, weil die 'this' sollte sein 'seq '; Sie müssten 'Typ seq mit ...' schreiben und das ist nicht erlaubt. – Tarmil

+0

@Tarmil Danke, ich denke die Moral der Geschichte ist, keine Antworten in Eile zu schreiben :) – TheInnerLight

Verwandte Themen