C# 非泛型方法&x27;IServiceProvider.GetService(类型)和#x27;不能与类型参数一起使用

C# 非泛型方法&x27;IServiceProvider.GetService(类型)和#x27;不能与类型参数一起使用,c#,.net-core,console-application,dependency-inversion,C#,.net Core,Console Application,Dependency Inversion,我使用的是.NET核心依赖项注入,但当我尝试在另一个类中获取服务时,会出现“IServiceProvider.GetService(Type)”无法与类型参数一起使用的错误 这个错误意味着什么? 我知道泛型类型参数是这样的:GenericInterface,GetService方法不将GenericInterface作为参数 为什么我会出现这个错误?我该如何解决它 接口 public interface IService { void Process(); } public class

我使用的是.NET核心依赖项注入,但当我尝试在另一个类中获取服务时,会出现“IServiceProvider.GetService(Type)”无法与类型参数一起使用的错误

这个错误意味着什么? 我知道泛型类型参数是这样的:GenericInterface,GetService方法不将GenericInterface作为参数

为什么我会出现这个错误?我该如何解决它

接口

public interface IService
{
   void Process();
}
public class Service : BaseService<IConfig, SomType>
{
    public Service(
        ILogger logger : base(logger)
    {
    }

    ...
}
实现接口的类

public interface IService
{
   void Process();
}
public class Service : BaseService<IConfig, SomType>
{
    public Service(
        ILogger logger : base(logger)
    {
    }

    ...
}
我是怎么注册的

serviceCollection.AddScoped<IService, Service>();
serviceCollection.addScope();
我如何得到我需要的服务

var incoming = serviceProvider.GetService<IService>();
var incoming=serviceProvider.GetService();

注意:我刚刚开始使用依赖注入、.NETCore,还不完全了解DI。你的回答将大有帮助

这意味着您的编译器只知道采用类型的方法

你可以打电话

var incoming = serviceProvider.GetService(typeof(IService));
或者你可以加一个

using Microsoft.Extensions.DependencyInjection;
确保编译器知道允许您将类型指定为泛型参数的扩展方法。这可能需要安装包Microsoft.Extensions.DependencyInjection.Abstractions。通用方法是一种扩展方法。这意味着您需要有:

using Microsoft.Extensions.DependencyInjection;
允许编译器找到它

此方法仅适用于可选服务。如果由于类型未注册或缺少某些依赖项而无法构造对象,则它将返回
null

应在应用程序无法工作时使用,除非服务可用。如果无法创建实例,它将抛出InvalidOperationException


当抛出该异常时,完整的异常文本将大大有助于发现实际问题。构造函数中抛出的异常可以出现在属性中。在抛出异常时结束的调用序列将显示在属性中。调用将返回一个字符串,该字符串包含当前异常和任何内部异常的所有信息。

简短回答在上面的帖子中有很好的解释:

ServiceProvider.GetService<T>(); 
另外请注意,如果在此之后出现null异常,则可能会出现多个问题:

  • 在启动中,确保Hostbuilder服务设置为ServiceProvider值

    ServiceProvider=host.Services

  • 另一个可能是T类的构造函数无法解析所使用接口的依赖关系
  • **

    谢谢!快乐编码:)


    **

    我开始写完全相同的答案,但你更快了:-)@nvoigt谢谢,这有效了,我现在在获得服务时出现了一个空异常错误。你知道是什么引起的吗?它起作用了,但我现在有一个空异常。您能帮忙吗?@Cookie这意味着该类型未注册或无法构造。如果应用程序无法使用特定的服务,请使用
    GetRequiredService
    。如果服务注册丢失,GetRequiredService将抛出一个解释原因的异常。有时很清楚(服务未注册或构造函数被抛出),有时not@Cookie为了帮助处理您的具体案例,您必须发布再现问题的代码。如果您尝试
    GetRequiredService
    发布由
    exception.ToString()返回的完整异常文本
    感谢您的快速回复@Panagiotis Kanavos。我找到了原因,出现空异常是因为“服务”正在使用的服务尚未注册。这很有效,谢谢。出于某种原因,intellisense没有给我暗示
    using Microsoft.Extensions.DependencyInjection;