(Этот вопрос по ILogger разрешен в этом вопросе . Мой вопрос спрашивает, как это выполняет система DI)
Мне было любопытно, как. NET Core ILogger<MyClass>
может быть разрешено для любого типа MyClass
. Я проверил исходный код и нашел этот:
services.TryAdd(ServiceDescriptor.Singleton(typeof(ILogger<>), typeof(Logger<>)));
Так что я понимаю, что когда мне нужно ILogger<MyClass>
, DI автоматически создаст Logger<MyClass>
. У меня вопрос от Reflection, как это происходит? Я сделал этот код для исследования:
var t1 = typeof(IList<>);
Console.WriteLine(t1.FullName); // System.Collections.Generic.IList`1
Console.WriteLine(t1.IsGenericType); // True
Console.WriteLine(t1.GetGenericArguments()[0].Name); // T
Console.WriteLine(t1.GetGenericArguments()[0].FullName); // null
var t2 = typeof(IList<int>);
Console.WriteLine(t2.FullName); // System.Collections.Generic.IList`1...
Console.WriteLine(t2.IsGenericType); // True
Console.WriteLine(t2.GetGenericArguments()[0].Name); // Int32
Console.WriteLine(t2.GetGenericArguments()[0].FullName); // System.Int32
Как ни странно, t1
все еще имеет действительный результат GetGenericArguments()
с типом T (и ноль FullName
). Это как реализация DI проверяет, является ли тип ввода Something<>
?