gpt4 book ai didi

c# - 在 C# 中使用 F# 类型

转载 作者:太空狗 更新时间:2023-10-29 23:13:33 24 4
gpt4 key购买 nike

我有一个 C# web api,我用它来访问 F# 库。我已经创建了一个我想要返回的类型的 DU,并使用模式匹配来选择返回到 c# Controller 的类型。

在 C# Controller 中,如何访问从函数调用返回到 F# 库的类型的数据?

C# Controller

public HttpResponseMessage Post()
{
var _result = Authentication.GetAuthBehaviour();
//Access item1 of my tuple
var _HTTPStatusCode = (HttpStatusCode)_result.item1;
//Access item2 of my tuple
var _body = (HttpStatusCode)_result.item2;
return base.Request.CreateResponse(_HTTPStatusCode, _body);
}

F# 类型

module Types =
[<JsonObject(MemberSerialization=MemberSerialization.OptOut)>]
[<CLIMutable>]
type ValidResponse = {
odata: string;
token: string;
}

[<JsonObject(MemberSerialization=MemberSerialization.OptOut)>]
[<CLIMutable>]
type ErrorResponse = {
code: string;
message: string;
url: string;
}

type AuthenticationResponse =
| Valid of int * ValidResponse
| Error of int * ErrorResponse

F#函数

module Authentication = 
open Newtonsoft.Json

let GetAuthBehaviour () =
let behaviour = GetBehaviour.Value.authentication
match behaviour.statusCode with
| 200 ->
let deserializedAuthenticationResponse = JsonConvert.DeserializeObject<Types.ValidResponse>(behaviour.body)
Types.Valid (behaviour.statusCode, deserializedAuthenticationResponse)
| _ ->
let deserializedAuthenticationResponse = JsonConvert.DeserializeObject<Types.ErrorResponse>(behaviour.body)
Types.Error (behaviour.statusCode, deserializedAuthenticationResponse)

最佳答案

F# 区分联合被编译为抽象类,每个案例都是派生的嵌套类。在 C# 中,您可以通过尝试向下转换 GetAuthBehaviour 的结果来访问案例:

public HttpResponseMessage Post()
{
var result = Authentication.GetAuthBehaviour();

var valid = result as Types.AuthenticationResponse.Valid;
if (valid != null)
{
int statusCode = valid.Item1;
Types.ValidResponse body = valid.Item2;
return this.CreateResponse(statusCode, body);
}

var error = result as Types.AuthenticationResponse.Error;
if (error != null)
{
int statusCode = error.Item1;
Types.ErrorResponse body = error.Item2;
return this.CreateResponse(statusCode, body);
}

throw new InvalidOperationException("...");
}

请注意,C# 编译器不知道您已经处理了所有情况,因此您需要提供一个分支来处理 result 既不是 Valid< 的情况错误。在这里,我只是以抛出异常为例,但在 Web API 中,返回 500 状态代码可能更合适。

尽管如此,为什么还要在 C# 中编写和维护 Controller 呢?你可以write an ASP.NET Web API purely in F# .

关于c# - 在 C# 中使用 F# 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34581554/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com