2017-10-20 53 views
0

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

没有反射,这是这样做的:

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。

出了什么问题?

对不起,我的英语:-)

+0

哪4行提示错误? –

+0

最后一个。但我确切地说,那个bind.Value实现了bind.Key ... –

+0

你应该在bindResult上调用我认为的。 –

回答

0

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

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)),所以你可以做 ​​3210