值不能为空.参数名称:类型

本文关键字:类型 参数 不能 | 更新日期: 2023-09-27 18:33:58

在stackExchange上阅读并尝试了答案后,我仍然在以下代码中得到一个空值:

    typeOfIMydServiceBase.Assembly
            .GetExportedTypes()
            .Where(exportedType => typeOfMydServiceBase != exportedType && typeOfMydServiceBase.IsAssignableFrom(exportedType))
            .Select(mydServiceType => new
            {
                serviceType = mydServiceType,
                interfaceType = mydServiceType.GetInterfaces().First(@interface => @interface != typeOfIMydServiceBase && typeOfIMydServiceBase.IsAssignableFrom(@interface))
            })
            .ToList()
            .ForEach(registrationInfo => container.Register(registrationInfo.interfaceType, () =>
            {
                var method = serviceActivatorType
                    .GetMethod("GetService", serviceActivatorParams)
                    .MakeGenericMethod(new[] { registrationInfo.interfaceType });
                var result = method.Invoke(new ServiceActivator(), null);
                return result;
            }, WebApiRequestLifestyleWithDisposal));
结果一直返回为空,当我使用 Object[] {null} 或 Object[]{}

或 Object[]{null,null,etc} 时,我得到参数不匹配。

注意:这是我收到的上述代码的错误消息:

第 156 行:.MakeGenericMethod(new[] { registrationInfo.interfaceType }(;

第 157 行:

第 158 行:变量结果 = 方法。Invoke(new ServiceActivator((, null(;

159行:

第 160 行:返回结果;

有谁知道这里发生了什么以及我该如何解决它????

{
public class ServiceActivator
{
    public ServiceActivator();
    public ServiceActivator(IServiceConfigurationReader configurationReader);
    public T GetService<T>();
    public T GetService<T>(string key);
}

}

与上述内容相关的还有所用服务的注册。见下文:

//Scan and register business servics
        var typeOfIMydServiceBase = typeof(IMydServiceBase);
        var typeOfMydServiceBase = typeof(MydServiceBase);
        var serviceActivatorType = typeof(ServiceActivator);
        var serviceActivatorParams = new Type[0];

更新:在服务激活器参数中使用类型(字符串(可以工作,但是我得到了一个未经处理的异常。这是新错误:

Line 166:                    p.ServiceContainer = container;
Line 167:                });
Line 168:
Line 169:                container.RegisterWebApiControllers(config);
Line 170:            }

它与以下代码有关:

var typeOfIMydServiceBase = typeof(IMydServiceBase);
        var typeOfMydServiceBase = typeof(MydServiceBase);
        var serviceActivatorType = typeof(ServiceActivator);
        var serviceActivatorParams = new Type[] { typeof(string) };
        
        typeOfIMydServiceBase.Assembly
            .GetExportedTypes()
            .Where(exportedType => typeOfMydServiceBase != exportedType && typeOfMydServiceBase.IsAssignableFrom(exportedType))
            .Select(mydServiceType => new
            {
                serviceType = mydServiceType,
                interfaceType = mydServiceType.GetInterfaces().First(@interface => @interface != typeOfIMydServiceBase && typeOfIMydServiceBase.IsAssignableFrom(@interface))
            })
            .ToList()
            .ForEach(registrationInfo => container.Register(registrationInfo.interfaceType, () =>
            {
                
                var method = serviceActivatorType
                    .GetMethod("GetService", serviceActivatorParams)
                    .MakeGenericMethod(new[] { registrationInfo.interfaceType });
           
                var result = method.Invoke(new ServiceActivator(), null);
                return result;
            }, WebApiRequestLifestyleWithDisposal));
        {
            container.RegisterInitializer<IMydServiceBase>(p =>
            {
                p.ServiceContainer = container;
            });
            container.RegisterWebApiControllers(config);
        }
    }

值不能为空.参数名称:类型

var method = serviceActivatorType .GetMethod("GetService", serviceActivatorParams)

返回带有var serviceActivatorParams = new Type[0]; public T GetService<T>();(来自问题中的注释讨论(

但是这一行:

var result = method.Invoke(new ServiceActivator(), null);

将调用此方法:

public T GetService<T>(string key);

null作为string key的值传递。

没有

要为public T GetService<T>();传递参数,这就是它引发异常的原因。

要解决您的问题,请尝试:

var serviceActivatorParams = new Type[] { typeof(string) };

或者在没有 null 参数的情况下调用您的方法:

var result = method.Invoke(new ServiceActivator());