C#中比较列表对象元素及Favorite Supplier ID遇运行时错误求助
解决Product对象Favorite Supplier ID比较的日志记录问题
嘿,我来帮你排查这个问题!首先咱们明确核心需求:对比两个Product实例的Favorite Supplier ID,只要二者不一样,就把差异记录到日志里。代码运行出错大概率是踩了几个常见的坑——比如空引用、Favorite Supplier没正确赋值,或是日志写入配置出问题。
我先梳理常见错误场景,再附上修正后的示例代码:
一、先确认基础类结构
首先得保证你的Product和Supplier类结构是合理的,比如:
public class Supplier { public int Id { get; set; } public string Name { get; set; } // 其他业务属性 } public class Product { public List<Supplier> Suppliers { get; set; } = new List<Supplier>(); public Supplier FavoriteSupplier { get; set; } // 其他业务属性 }
二、常见错误点及解决方案
1. 空引用异常(最常见)
如果其中一个Product的FavoriteSupplier是null,直接访问Id会立刻抛出NullReferenceException。
解决办法:先做空值校验,再执行ID比较
public void CompareFavoriteSuppliers(Product product1, Product product2, ILogger logger) { // 先判断两个FavoriteSupplier是否都不为null if (product1.FavoriteSupplier != null && product2.FavoriteSupplier != null) { if (product1.FavoriteSupplier.Id != product2.FavoriteSupplier.Id) { logger.LogInformation("两个Product的Favorite Supplier ID不同:Product1的ID={0},Product2的ID={1}", product1.FavoriteSupplier.Id, product2.FavoriteSupplier.Id); } } else { // 处理空值场景 if (product1.FavoriteSupplier == null && product2.FavoriteSupplier == null) { logger.LogInformation("两个Product都未设置Favorite Supplier"); } else { var nullProductLabel = product1.FavoriteSupplier == null ? "Product1" : "Product2"; logger.LogWarning("{0}的Favorite Supplier为null,无法完成ID比较", nullProductLabel); } } }
2. 日志配置错误
如果日志没正确配置(比如没指定文件输出路径、没有写入权限),会导致日志写入失败,看起来像是代码出错。
解决办法:以.NET Core为例,先在appsettings.json配置日志文件输出:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" }, "File": { "Path": "./Logs/product-comparison.log", "Append": true, "LogLevel": { "Default": "Information" } } } }
同时确保项目安装了对应的日志包(比如Serilog.AspNetCore或Microsoft.Extensions.Logging.File)。
3. Supplier列表与Favorite Supplier的关联问题
如果FavoriteSupplier不是从当前Product的Suppliers列表中赋值的(比如手动创建了一个不在列表里的Supplier实例),虽然不会触发运行时错误,但会不符合业务逻辑。
解决办法:在Product类中添加赋值校验:
public class Product { private Supplier _favoriteSupplier; public List<Supplier> Suppliers { get; set; } = new List<Supplier>(); public Supplier FavoriteSupplier { get => _favoriteSupplier; set { if (value != null && !Suppliers.Contains(value)) { throw new ArgumentException("Favorite Supplier必须属于当前Product的Suppliers列表"); } _favoriteSupplier = value; } } }
三、完整示例调用
// 初始化测试数据 var supplier1 = new Supplier { Id = 1, Name = "供应商A" }; var supplier2 = new Supplier { Id = 2, Name = "供应商B" }; var product1 = new Product { Suppliers = new List<Supplier> { supplier1, supplier2 }, FavoriteSupplier = supplier1 }; var product2 = new Product { Suppliers = new List<Supplier> { supplier1, supplier2 }, FavoriteSupplier = supplier2 }; // 获取日志实例(以.NET Core为例) var loggerFactory = LoggerFactory.Create(builder => { builder.AddFile("Logs/product-comparison.log"); }); var logger = loggerFactory.CreateLogger<Program>(); // 执行比较逻辑 CompareFavoriteSuppliers(product1, product2, logger);
如果你的错误是其他特定情况(比如编译错误、特定异常提示),可以把具体的错误信息和你的代码片段贴出来,我再帮你精准排查!
内容的提问来源于stack exchange,提问作者satputenandkumar
相关产品推荐
相关产品推荐

