具有多个约束的通用方法

时间:2009-02-26 00:55:08

标签: c# generics .net-3.5

我有一个通用方法,它有两个通用参数。我试图编译下面的代码,但它不起作用。它是.NET限制吗?是否可以为不同的参数设置多个约束?

public TResponse Call<TResponse, TRequest>(TRequest request)
  where TRequest : MyClass, TResponse : MyOtherClass

4 个答案:

答案 0 :(得分:363)

可以这样做,你的语法略有错误。每个约束都需要where,而不是用逗号分隔它们:

public TResponse Call<TResponse, TRequest>(TRequest request)
    where TRequest : MyClass
    where TResponse : MyOtherClass

答案 1 :(得分:1)

除了@LukeH的主要回答外,我还遇到了依赖项注入问题,并且花了一些时间来解决此问题。对于那些面临相同问题的人,值得分享:

public interface IBaseSupervisor<TEntity, TViewModel> 
    where TEntity : class
    where TViewModel : class

以这种方式解决。在容器/服务中,关键是typeof和逗号(,)

services.AddScoped(typeof(IBaseSupervisor<,>), typeof(BaseSupervisor<,>));

answer中已提及。

答案 2 :(得分:1)

每个约束都需要在自己的行上,如果单个通用参数有更多约束,则需要用逗号分隔。

public TResponse Call<TResponse, TRequest>(TRequest request)
    where TRequest : MyClass, 
    where TResponse : MyOtherClass, IOtherClass

答案 3 :(得分:0)

除了@LukeH的主要答案还有其他用法外,我们还可以使用多个接口代替类。 (一个类和n个计数接口)

public void extractResourceFromJar(String resource, String dstPath) {

    File destination = new File(dstPath);
    InputStream sourceStream = getClass().getResourceAsStream(resource);

    FileUtils.copyInputStreamToFile(sourceStream, destination);

}

public TResponse Call<TResponse, TRequest>(TRequest request)
  where TRequest : MyClass, IMyOtherClass, IMyAnotherClass