【问题标题】:Accessing type "properties" in C#在 C# 中访问类型“属性”
【发布时间】:2019-03-05 18:01:23
【问题描述】:

我正在使用 ROP(面向铁路的编程),在 SQLite 包装器中根据 swlaschin 对其进行建模:

我正在返回 RopResult 类型:

type RopResult<'TSuccess, 'TMessage> =
    | Success of 'TSuccess * 'TMessage list
    | Failure of 'TMessage list

在 F# 中,所有的工作都很好,但有时我仍然需要与 C# 互操作,并且在返回 RopResult 时,事情就崩溃了。即:

RopResult<seq 't, DomainMessage>

如何访问那些“属性”(即 C# 的 ienumerable),而不必将其转换为 dynamic

var ropResult = dao.All; //  RopResult<seq 't, DomainMessage>
var dyn = ropResult as dynamic;
foreach (SomeClass item in dyn.Item1)
{
    Console.WriteLine(item.Id);
}

【问题讨论】:

  • 您需要对 RopResult 类型进行模式匹配,这是 C# 无法做到的。我想你最好的选择是从 F# 中提供一些“适配器”函数,这些函数比实际的可区分联合更 C# 友好。

标签: f# c#-to-f#


【解决方案1】:

您可以简单地转换为相关子类型或使用模式匹配(在 C# 7.0 或更高版本中):

switch (result)
{
    case RopResult<IEnumerable<T>, DomainMessage>.Success success:
        var value = success.Item1;
        var messages = success.Item2;
        // do something
        break;
    case RopResult<IEnumerable<T>, DomainMessage>.Failure failure:
        var errors = failure.Item;
        // do something else
        break;
    default:
        throw new ArgumentOutOfRangeException();
}    

但是,这不是 C# 的理想 API。您可能想编写一些扩展方法来帮助解决这个问题。你可能会收到some inspiration from Chessie

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    相关资源
    最近更新 更多