如何将区分联合从 C# 传递到 F# 函数(F# - C# 互操作)
How to pass a discriminated union from C# to a F# function (F# - C# interop)
模型定义:
type ItemEvent =
| ItemCreated of ItemCreated
and ItemCreated = { timestamp:DateTime; id:ItemId; name:string; description:string option } interface IEvent
这是我要调用的方法的接口:
type IItemWriteAccess =
abstract Update: ItemEvent -> Result<unit, DomainMessage>
这是 C# 代码:
public class ItemEventHandlers
{
private readonly IItemWriteAccess _repository;
public ItemEventHandlers(IItemWriteAccess repository)
{
_repository = repository;
}
public void Handle(ItemCreated msg)
{
if(msg == null) throw new ArgumentNullException("msg");
_repository.Update(msg); // this doesn't work
}
}
这会产生以下错误消息:
Argument 1: cannot convert from 'DomainModels.ItemCreated' to 'DomainModels.ItemEvent'
向上转换到 ItemEvent
也不起作用。
我该如何解决这个问题?
由于 Update
采用 ItemEvent
,ItemCreated
实例不能作为参数传递。
我必须创建一个 ItemEvent
并将 ItemCreated
实例传递给构造函数,如下所示:
var @event = ItemEvent.NewItemCreated(msg);
然后我可以传给Update
:
public void Handle(ItemCreated msg)
{
if(msg == null) throw new ArgumentNullException("msg");
var @event = ItemEvent.NewItemCreated(msg);
_repository.Update(@event);
}
模型定义:
type ItemEvent =
| ItemCreated of ItemCreated
and ItemCreated = { timestamp:DateTime; id:ItemId; name:string; description:string option } interface IEvent
这是我要调用的方法的接口:
type IItemWriteAccess =
abstract Update: ItemEvent -> Result<unit, DomainMessage>
这是 C# 代码:
public class ItemEventHandlers
{
private readonly IItemWriteAccess _repository;
public ItemEventHandlers(IItemWriteAccess repository)
{
_repository = repository;
}
public void Handle(ItemCreated msg)
{
if(msg == null) throw new ArgumentNullException("msg");
_repository.Update(msg); // this doesn't work
}
}
这会产生以下错误消息:
Argument 1: cannot convert from 'DomainModels.ItemCreated' to 'DomainModels.ItemEvent'
向上转换到 ItemEvent
也不起作用。
我该如何解决这个问题?
由于 Update
采用 ItemEvent
,ItemCreated
实例不能作为参数传递。
我必须创建一个 ItemEvent
并将 ItemCreated
实例传递给构造函数,如下所示:
var @event = ItemEvent.NewItemCreated(msg);
然后我可以传给Update
:
public void Handle(ItemCreated msg)
{
if(msg == null) throw new ArgumentNullException("msg");
var @event = ItemEvent.NewItemCreated(msg);
_repository.Update(@event);
}