我正在使用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);
}
答案 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。