System.Linq.Enumerable.OfType <T> - 是否有F#方式?

Chr*_*elt 2 f# c#-to-f# type-providers

我正在寻找使用F#WSDL类型提供程序.要调用我正在使用的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;
}
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止的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
Run Code Online (Sandbox Code Playgroud)

是否有F#相当于System.Linq.Enumerable.OfType<T>或者我应该使用raw OfType<T>

Tom*_*cek 5

我想这个问题主要是关于breakF#中没有的构造.好吧,代码实际上只是为集合的第一个元素设置用户名和密码(如果集合为空,则为none).如果您将集合转换为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
| _ -> ()
Run Code Online (Sandbox Code Playgroud)

  • 哦,我明白了 - 我认为没有内置的等同于`OfType`扩展方法.但是,从F#使用LINQ方法是完全正常的,所以你可以继续使用`OfType <T>`...(有`Seq.cast <T>`但只是试图施放的所有元素,使这里不是有帮助...) (3认同)