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)
我在我的项目中使用 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)