C#如何在函数内定义List的泛型T类型 并实现通用日志生成方法
实现代码
通用日志工具类实现
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; namespace ewmsCsharp.Models { // 静态工具类更适合通用日志场景 public static class Logging { // 泛型方法:调用时指定对应类的类型,直接返回匹配类型的日志实例 public static ILogger<T> SetLogger<T>() { // 用GetRequiredService避免空引用问题,未注册时会直接抛出异常便于排查 return _serviceProvider.GetRequiredService<ILoggerFactory>() .CreateLogger<T>(); } // 可选重载:支持动态传入Type参数的场景 public static ILogger SetLogger(Type targetType) { return _serviceProvider.GetRequiredService<ILoggerFactory>() .CreateLogger(targetType); } // 加readonly修饰避免服务提供器被意外修改 private static readonly ServiceProvider _serviceProvider = new ServiceCollection() .AddLogging(configuration => { configuration.AddConsole(); configuration.SetMinimumLevel(LogLevel.Debug); }) .BuildServiceProvider(); } }
日志方法调用示例
public class YourBusinessClass { // 调用时指定当前类为泛型参数,即可拿到对应类型的日志实例 private static readonly ILogger<YourBusinessClass> _logger = Logging.SetLogger<YourBusinessClass>(); public void TestMethod() { _logger.LogDebug("测试日志输出"); } }
泛型创建指定类型List的实现
按需求封装通用泛型方法,避免重复写List初始化逻辑:
public static class CommonUtils { // 通用创建指定类型List的方法,可自定义通用逻辑 public static List<T> CreateTypedList<T>(params T[] initItems) { var result = new List<T>(); // 可在这里加你的通用逻辑:比如默认填充值、校验、数据预处理等 if (initItems != null && initItems.Length > 0) { result.AddRange(initItems); } return result; } }
调用示例:
// 创建int类型的List var intList = CommonUtils.CreateTypedList<int>(1, 2, 3, 4); // 创建string类型的List var strList = CommonUtils.CreateTypedList<string>("a", "b", "c"); // 创建自定义实体类型的List var userList = CommonUtils.CreateTypedList<User>(new User { Id = 1, Name = "张三" });
注意事项
如果是在ASP.NET Core项目中,更推荐直接使用框架自带的依赖注入获取ILogger<T>实例,不需要自行封装静态日志类,上述静态日志实现更适合控制台、桌面端等非Web场景使用。
内容的提问来源于stack exchange,提问作者legopart
相关产品推荐
相关产品推荐

