在c#中创建自定义容器类

时间:2016-04-20 16:43:01

标签: c# .net dependency-injection inversion-of-control

我正在为自定义IOC容器编写一个基本的c#类,它有两个公共方法Register()& Resolve()和一个私有方法CreateInstance()

下面是我的代码。

在下面的Code,CreateInstance()方法中,我得到语法错误来解析依赖项(注释行),而不使用Generics我可以解析依赖项并且它工作正常,同时使用泛型进行默认类型转换我是得到语法错误

任何人都可以在这条评论线上帮助我吗?

  public class Container
  {
    static Dictionary<Type, Func<object>> registrations = new Dictionary<Type, Func<object>>();
    public static void Register<TService, TImpl>() where TImpl : TService
    {
        registrations.Add(typeof(TService), () => Resolve<TImpl>());
    }

    public static T Resolve<T>()
    {
        var serviceType = typeof(T);
        Func<object> creator;
        if (registrations.TryGetValue(serviceType, out creator)) return (T)creator();
        if (!serviceType.IsAbstract) return CreateInstance<T>();
        else throw new InvalidOperationException("No registration for " + serviceType);
    }

    private static T CreateInstance<T>()
    {
        var implementationType = typeof(T);
        var ctor = implementationType.GetConstructors().Single();
        var parameterTypes = ctor.GetParameters().Select(p => p.ParameterType);        
        //var dependencies = parameterTypes.Select(Resolve).ToArray();            
        return (T)Activator.CreateInstance(implementationType, dependencies);
    }
}

1 个答案:

答案 0 :(得分:1)

我知道这是前一段时间的帖子,但是如果有人想知道如何动态传递类型,可以使用下面的代码进行反射:

        var dependencies = parameterTypes.Select(paramType => typeof(Container).GetMethod("Resolve")?.MakeGenericMethod(paramType).Invoke(null, null)).ToArray();            

这将找到Resolve方法,使用参数类型作为通用类型,然后不带任何参数地调用它。