所以我在c#中有以下代码行来注册AutoMapper和SimpleInjector:
container.Register(() => config.CreateMapper(container.GetInstance));
对于上下文,config.CreateMapper()
看起来像这样:
public IMapper CreateMapper(Func<Type, object> serviceCtor);
虽然container.GetInstance
看起来像这样:
public object GetInstance(Type serviceType);
我发布的第一行代码在C#中工作,因为config.CreateMapper
接受一个Type
类型的函数,并返回object
类型。正是container.GetInstance
的作用。
当我尝试在VB中执行相同的行时,如:
container.Register(Function() config.CreateMapper(container.GetInstance))
它出错Type arguments for 'Public Function Container.GetInstance(Of TService)()' cannot be inferred from the usage. Try specifying type arguments explicitly
。它给出了这个错误,因为container.GetInstance
有一个看起来像这样的重载:
public TService GetInstance<TService>() where TService : class;
为什么VB尝试使用GetInstance
的错误重载,如何强制它使用正确的重载?
答案 0 :(得分:1)
使用AddressOf
获取功能参考。
container.Register(Function() config.CreateMapper(AddressOf container.GetInstance))
在带有括号的C#函数中执行它,没有括号的函数将返回对函数的引用。
在VB.NET中,函数中的括号是可选的 - 无论如何都将执行函数。因此,对于引用函数,您应该使用AddressOf
运算符
AddressOf Operator
答案 1 :(得分:0)
在函数参数前使用AddressOf
关键字将其定义为参数作为函数指针。
AddressOf
与C#中的@
关键字相同。关键字隐含在c#示例中使用。