簡體   English   中英

在 C# 中創建自定義容器類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM