我在我的项目中使用Ninject lib。我有一个任务:我需要通过传递字典将接口绑定到服务,我更喜欢使用反射。
在没有反映的情况下,这样做是:
kernel.Bind<IUser>().To<User>();其中IUser -界面,用户- 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。
怎么啦?
对不起,我的英语:-)
发布于 2017-10-20 08:47:20
您的问题是,您正在调用内核对象上的方法,而不是方法的结果。这会解决你的问题
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但是所有这些都是不必要的,因为绑定函数有一个非泛型实现kernel.Bind(typeof(IUser)).To(typeof(User)),所以您可以只执行kernel.Bind(bind.Key).To(bind.Value)。
https://stackoverflow.com/questions/46842560
复制相似问题