[英]Creating Custom Container Class in c#
我正在為自定義 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 方法,使用參數類型作為泛型類型,然后不帶參數調用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.