C# 如何从类型注册到<;T>;

C# 如何从类型注册到<;T>;,c#,inversion-of-control,mvvm-light,windows-phone-8.1,C#,Inversion Of Control,Mvvm Light,Windows Phone 8.1,我正在为Windows 8.1和Windows Phone 8.1开发一个通用应用程序,使用MVVM light软件包及其SimpleIoc 目前,我有这样的注册: SimpleIoc.Default.Register<ISettings, LocalSettings>(); SimpleIoc.Default.Register<INavigationService, NavigationService>(); “服务”是一个包含2个字符串(接口/实现)的变量,指定IS

我正在为Windows 8.1和Windows Phone 8.1开发一个通用应用程序,使用MVVM light软件包及其SimpleIoc

目前,我有这样的注册:

SimpleIoc.Default.Register<ISettings, LocalSettings>();
SimpleIoc.Default.Register<INavigationService, NavigationService>();
“服务”是一个包含2个字符串(接口/实现)的变量,指定ISetting等的类型和程序集

如何将这两种类型注册到SimpleIoc容器

我无法执行以下操作:

Type interfaceType = Type.GetType(service.Interface);
Type implementationType = Type.GetType(service.Implementation);
SimpleIoc.Default.Register(interfaceType, implementationType);
我必须使用另一个容器吗?是否存在一些扩展


谢谢大家!

由于
SimpleIoc
类型不提供非泛型方法来执行此操作,因此您必须在运行时创建自己的泛型方法:

// Get the Register<T1,T2>() method
MethodInfo methodInfo =
    SimpleIoc.Default.GetType().GetMethods()
             .Where(m => m.Name == "Register")
             .Where(m => m.IsGenericMethod)
             .Where(m => m.GetGenericArguments().Length == 2)
             .Where(m => m.GetParameters().Length == 0)
             .Single();

// Create the generic type parameters to the method
Type interfaceType = Type.GetType(service.Interface);
Type implementationType = Type.GetType(service.Implementation);

// Create a version of the method that takes your types
methodInfo = methodInfo.MakeGenericMethod(interfaceType, implementationType);

// Invoke the method on the default container (no parameters)
methodInfo.Invoke(SimpleIoc.Default, null);
//获取Register()方法
方法信息方法信息=
SimpleIoc.Default.GetType().GetMethods()
.其中(m=>m.Name==“寄存器”)
.Where(m=>m.IsGenericMethod)
.Where(m=>m.GetGenericArguments().Length==2)
.Where(m=>m.GetParameters().Length==0)
.Single();
//为方法创建泛型类型参数
Type interfaceType=Type.GetType(service.Interface);
类型implementationType=Type.GetType(service.Implementation);
//创建采用您的类型的方法版本
methodInfo=methodInfo.MakeGenericMethod(interfaceType,implementationType);
//调用默认容器上的方法(无参数)
调用(SimpleIoc.Default,null);

如果未来的
SimpleIoc
接口发生变化,那么它会非常难看,而且有点脆弱,但是它完成了任务。

事实上,在发生变化的情况下,这并不是最好的。我没有这样做,而是更改了Unity容器及其服务定位器适配器。如果人们想保留SimpleIoc,我会将您的答案标记为已验证。谢谢SimpleIoc不提供非泛型寄存器方法这一事实实际上是一个缺点,因为它使动态加载类型变得非常困难(如果不是不可能的话),在我看来这是一件非常常见的事情。这是一个微不足道的,虽然,因为我真的喜欢它的简单。