2

F# WSDL Type Provider の使用を検討しています。使用している Web サービスを呼び出すには、クライアント資格情報をSystem.ServiceModel.Description.ClientCredentials.

これは私が持っているC#コードです:

var serviceClient = new InvestmentServiceV1Client.InvestmentServiceV1Client();

foreach (ClientCredentials behaviour in serviceClient.Endpoint.Behaviors.OfType<ClientCredentials>())
{
    (behaviour).UserName.UserName = USERNAME;
    (behaviour).UserName.Password = PASSWORD;
    break;
}

これは私がこれまでに持っているF#コードです:

let client = new service.ServiceTypes.InvestmentServiceV1Client()
let xxx = client.Endpoint.Behaviors
|> Seq.choose (fun p -> 
    match box p with   
    :?   System.ServiceModel.Description.ClientCredentials as x -> Some(x) 
    _ -> None) 
|> (System.ServiceModel.Description.ClientCredentials)p.UserName.UserName = USERNAME

F# に相当するものはありますか、それともSystem.Linq.Enumerable.OfType<T>raw を使用する必要がありOfType<T>ますか?

4

2 に答える 2

5

質問は主にbreak、F# では使用できないコンストラクトに関するものだと思います。コードは実際には、コレクションの最初の要素のユーザー名とパスワードを設定するだけです (または、コレクションが空の場合は何も設定しません)。これは、コレクションを F# リストに変換すると、パターン マッチングを使用して簡単に実行できます。

// Get behaviours as in C# and convert them to list using 'List.ofSeq'
let sc = new InvestmentServiceV1Client.InvestmentServiceV1Client()
let behaviours = sc.Endpoint.Behaviors.OfType<ClientCredentials>() |> List.ofSeq

// Now we can use pattern matching to see if there is something in the list
match behaviours with
| behaviour::_ ->
    // And if the list is non-empty, set the user name and password
    behaviour.UserName.UserName <- USERNAME
    behaviour.UserName.Password <- PASSWORD
| _ -> ()
于 2013-10-14T08:45:33.307 に答える
4

.OfType()に相当する F# を既に実装していると思います。breakステートメントをエミュレートするには、Tomas が回答で行っているように (リストで一致させる)、またはSeq.headを呼び出します(要素が残っていない場合はスローします)、またはこれを行うことができます。

let xxx = 
    client.Endpoint.Behaviors
    |> Seq.choose (function
        | :? System.ServiceModel.Description.ClientCredentials as x -> Some x
        | _ -> None ) 
    |> Seq.tryPick Some

match xxx with
| Some behavior -> ... // First element of required type found
| None -> ...          // No elements of required type at all in sequence
于 2013-10-14T11:29:11.700 に答える