C# 在c中创建自定义容器类
我正在为定制IOC容器编写一个基本的c类,其中包含两个公共方法Register&Resolve和一个私有方法CreateInstance 下面是我的代码 在下面的代码CreateInstance方法中,我得到了语法错误来解析依赖项注释行,不使用泛型我可以解析依赖项,它工作正常,而使用泛型进行默认类型转换我得到了语法错误 有人能在这条线上帮我吗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>
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