Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c中创建自定义容器类_C#_.net_Dependency Injection_Inversion Of Control - Fatal编程技术网

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

C# 在c中创建自定义容器类,c#,.net,dependency-injection,inversion-of-control,C#,.net,Dependency Injection,Inversion Of Control,我正在为定制IOC容器编写一个基本的c类,其中包含两个公共方法Register&Resolve和一个私有方法CreateInstance 下面是我的代码 在下面的代码CreateInstance方法中,我得到了语法错误来解析依赖项注释行,不使用泛型我可以解析依赖项,它工作正常,而使用泛型进行默认类型转换我得到了语法错误 有人能在这条线上帮我吗 public class Container { static Dictionary<Type, Func<object>

我正在为定制IOC容器编写一个基本的c类,其中包含两个公共方法Register&Resolve和一个私有方法CreateInstance

下面是我的代码

在下面的代码CreateInstance方法中,我得到了语法错误来解析依赖项注释行,不使用泛型我可以解析依赖项,它工作正常,而使用泛型进行默认类型转换我得到了语法错误

有人能在这条线上帮我吗

  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);
    }
}

我知道这是不久前的一篇文章,但是如果有人想知道如何动态传递类型,您可以使用下面的代码通过反射来实现:

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

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

我遇到语法错误什么错误?无法从用法推断方法“System.Linq.Enumerable.SelectSystem.Collections.generic.IEnumerable,System.Func”的类型参数。请尝试显式指定类型参数。代码的源代码似乎是,但您已从该帖子中删除了非泛型GetInstanceType方法。请注意该答案中给出的建议:请注意,您永远不应该实际使用此类实现。它缺少DI库提供的许多重要特性,但与使用纯DI(即手动连接对象图)相比,它没有任何优势。您失去了编译时支持,没有得到任何回报。。因此,除了学习目的,不要将该代码用于其他任何目的。在生产中使用或使用已建立的DI库。无法从用法推断方法“Enumerable.SelectIEnumerable,Func”的类型参数。尝试显式指定类型参数。我不知道如何在select方法中传递动态类型来解析func