首页 > 解决方案 > 在 C# 中访问类型“属性”

问题描述

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

我正在返回RopResult类型:

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

并且在 F# 组合中一切正常,但有时我仍然需要与 C# 互操作,并且在返回时RopResult事情会崩溃。IE:

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);
}

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

解决方案


您可以简单地转换为相关的子类型或使用模式匹配(在 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。您可能想编写一些扩展方法来帮助解决这个问题。你可能会从 Chessie 那里得到一些灵感


推荐阅读