読者です 読者をやめる 読者になる 読者になる

C# でも匿名型でインタフェースを実装できたらいいのにとたまに思う

.net

たとえば

public interface IDomainEventHandler
{
    bool CanHandle(IDomainEvent e);
    void Handle(IDomainEvent e);
}

というインタフェースがあるとき

EventBus.Register(new IDomainEventHandler
{
    public bool CanHandle(IDomainEvent e)
    {
        return e is ProjectCreatedEvent;
    }

    public void Handle(IDomainEvent e)
    {
        // なんかやる
    }
});

という風に書きたいことがたまにある。Java は書けるけど、C# では書けない。

今のところは

public class DelegateEventHandler : IDomainEventHandler
{
    private Func<IDomainEvent, bool> _canHandle;
    private Action<IDomainEvent> _handle;

    public DelegateEventHandler(Func<IDomainEvent, bool> canHandle, Action<IDomainEvent> handle)
    {
        _canHandle = canHandle;
        _handle = handle;
    }

    public bool CanHandle(IDomainEvent e) => _canHandle(e);

    public void Handle(IDomainEvent e) => _handle(e);
}

みたいなクラスを作って

EventBus.Register(new DelegateEventHandler(
    e => e is ProjectCreatedEvent,
    e => { /* なんかやる */ }
));

ってな感じで書いてはいるけど、このときだけは Java が羨ましい。