C# Ninject 从字典 <Type, Type> 绑定

C# Ninject binding from Dictionary<Type, Type>

我在我的项目中使用 Ninject 库。我有一个任务:我需要通过传递的字典将接口绑定到服务,我更喜欢使用反射。

不经思考就这样做了:

kernel.Bind<IUser>().To<User>();

其中 IUser - 接口,User - IUser 实现。

反思我这样做:

MethodInfo method = kernel.GetType().GetMethods().FirstOrDefault(x=>x.Name == "Bind");
MethodInfo genericBind = method.MakeGenericMethod(bind.Key);
MethodInfo bindResult = genericBind.Invoke(kernel,null).GetType().GetMethods().FirstOrDefault(x => x.Name == "To" && x.IsGenericMethod == true);
MethodInfo genericTo = bindResult.MakeGenericMethod(bind.Value);
genericTo.Invoke(kernel, null); //Error is here

但是我得到一个错误 System.Reflection.TargetException。

怎么了?

对不起我的英语:-)

好的,您的问题是您是在内核对象上而不是在方法的结果上调用方法。这将解决您的问题

MethodInfo method = kernel.GetType().GetMethods().FirstOrDefault(x=>x.Name == "Bind");
MethodInfo genericBind = method.MakeGenericMethod(bind.Key);
var result = genericBind.Invoke(kernel,null);
MethodInfo bindResult = result.GetType().GetMethods().FirstOrDefault(x => x.Name == "To" && x.IsGenericMethod == true);
MethodInfo genericTo = bindResult.MakeGenericMethod(bind.Value);
genericTo.Invoke(result, null); //Error is here

但是所有这些都是不必要的,因为 Bind 函数有一个非通用的实现 kernel.Bind(typeof(IUser)).To(typeof(User)) 所以你可以这样做 kernel.Bind(bind.Key).To(bind.Value)