f# - 在 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);
}
解决方案
您可以简单地转换为相关的子类型或使用模式匹配(在 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 那里得到一些灵感。
推荐阅读
- c++ - (如何)我可以在不安装完整的 boost 库的情况下使用 boost::spirit X3 吗?
- r - 映射嵌套的小标题,变异并应用函数
- vb.net - System.ArgumentException: '无法绑定到 DataSource 上的属性或列 Reserve By Staff。参数名称:dataMember'
- c++ - 删除不需要的空格,但在值之间
- c# - Blazor:在前一个操作完成之前在此上下文上启动了第二个操作
- email - 通过 Quickbase 中的按钮发送和填充电子邮件
- asp.net - Web 窗体 GridView 在 IE 以外的浏览器中无法正确显示
- javascript - 需要帮助获取 Voronoi 细胞
- nlp - 如何使用 Fairseq 从头开始训练一个简单的 vanilla 转换器翻译模型
- c# - 外部函数中参数的正确格式