F# “访问类型”;物业;在C中#

F# “访问类型”;物业;在C中#,f#,c#-to-f#,F#,C# To F#,我正在使用ROP(面向铁路的编程),在SQLite包装中对其进行建模: 我将返回RopResult类型: type RopResult<'TSuccess, 'TMessage> = | Success of 'TSuccess * 'TMessage list | Failure of 'TMessage list 我如何访问这些“属性”(即C#的ienumerable),而不必将其转换为动态: var ropResult = dao.All; // RopRe

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

我将返回
RopResult
类型:

type RopResult<'TSuccess, 'TMessage> =
    | Success of 'TSuccess * 'TMessage list
    | Failure of 'TMessage list
我如何访问这些“属性”(即C#的ienumerable),而不必将其转换为
动态

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

var-ropResult=dao.All;//RopResult您可以简单地强制转换到相关的子类型或使用模式匹配(在C#7.0或更高版本中):

开关(结果)
{
案例结果。成功:
var值=success.Item1;
var messages=success.Item2;
//做点什么
打破
案例结果。失败:
变量错误=失败。项;
//做点别的
打破
违约:
抛出新ArgumentOutOfRangeException();
}    

然而,这不是一个理想的C#API。您可能需要编写一些扩展方法来帮助实现这一点。您可能会得到。

您需要在
ROPSresult
类型上进行模式匹配,而C#不能这样做。我想你最好的选择是提供一些来自F#的“适配器”函数,这些函数比实际的受歧视的联合更友好。
var ropResult = dao.All; //  RopResult<seq 't, DomainMessage>
var dyn = ropResult as dynamic;
foreach (SomeClass item in dyn.Item1)
{
    Console.WriteLine(item.Id);
}