在C#中访问类型“属性”

时间:2019-03-04 21:50:13

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

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

我将返回RopResult类型:

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

所有内容在F#的合成中都可以正常工作,但有时我仍然需要使用C#,并且在返回RopResult时会崩溃。即:

RopResult<seq 't, DomainMessage>

如何访问这些“属性”(即C#的枚举数),而不必将其强制转换为dynamic

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

1 个答案:

答案 0 :(得分:2)

您可以简单地转换为相关的子类型或使用模式匹配(在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