值不能为空。参数名称:类型
Value cannot be null. Parameter name: type
阅读并尝试了 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));
结果一直返回为 null,当我使用 Object[] {null} 或 Object[]{} 或 Object[]{null,null,etc} 时,我得到参数不匹配。
注意:这是我收到的上述代码的错误消息:
Line 156: .MakeGenericMethod(new[] { registrationInfo.interfaceType });
Line 157:
Line 158: var result = method.Invoke(new ServiceActivator(), null);
Line 159:
Line 160: return result;
有谁知道这里发生了什么以及我该如何解决????
{
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];
更新:在 serviceActivator 参数中使用 typeof(string) 可以工作,但是我得到了一个未处理的异常。这是新错误:
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)
returns public T GetService<T>();
with var serviceActivatorParams = new Type[0];
(来自问题中的评论讨论)
但是这一行:
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());
阅读并尝试了 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));
结果一直返回为 null,当我使用 Object[] {null} 或 Object[]{} 或 Object[]{null,null,etc} 时,我得到参数不匹配。
注意:这是我收到的上述代码的错误消息:
Line 156: .MakeGenericMethod(new[] { registrationInfo.interfaceType });
Line 157:
Line 158: var result = method.Invoke(new ServiceActivator(), null);
Line 159:
Line 160: return result;
有谁知道这里发生了什么以及我该如何解决????
{
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];
更新:在 serviceActivator 参数中使用 typeof(string) 可以工作,但是我得到了一个未处理的异常。这是新错误:
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)
returns public T GetService<T>();
with var serviceActivatorParams = new Type[0];
(来自问题中的评论讨论)
但是这一行:
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());