首页 > 解决方案 > 从回调函数推断泛型参数类型

问题描述

我有一段目前看起来像这样的代码:

订阅方法的签名:

void Subscribe<T, TResult>(Func<T, TResult> action);

class Service { 
   int methodThatRequiresIntAndReturnsInt(int i) => i * 2;
}

在我看来,在尝试使用 subscribe 方法时应该可以推断 T 和 TReturn 的类型,但是编译器告诉我无法从使用中推断出类型,这意味着我最终编写了以下代码:

Queue.Subscribe<int, int>(Service.methodThatRequiresIntAndReturnsInt);

我的问题是它是否可能,如果可能,方法签名/用法应该如何看待,以便可以在没有类型提示的情况下使用它,例如:

Queue.Subscribe(input => input * 2);

当前的实现是这样的:

_commandSubscription.Subscribe<CreateUpdateCommand, bool>(Resolve<UpdateService>().CreateUpdate);
_commandSubscription.Subscribe<AddCommentCommand>(Resolve<UpdateService>().AddComment);

服务方法的实现如下:

public class UpdateService {

    public void AddComment(AddCommentCommand command) {
         // DO STUFF
    }

    public bool CreateUpdate(CreateUpdateCommand command) {
        // Do stuff 
        return true;
    }

}

标签: c#apigenericscallback

解决方案


您可以执行以下操作:

Queue.Subscribe((int i) => Service.methodThatRequiresIntAndReturnsInt(i));

在实践中,订阅函数的工作方式是等效的,并且您避免显式键入所有通用参数。


推荐阅读