F# “访问类型”;物业;在C中#
我正在使用ROP(面向铁路的编程),在SQLite包装中对其进行建模: 我将返回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
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);
}