C#调用ToString()返回对象类型而非实际值该如何解决?
问题根因
- 遍历逻辑错误:你内层通过反射遍历了
PaidTrip类的所有属性,而非只获取LicenseHolderID属性的值,当遍历到类中类型为Action的属性时,对该属性值调用ToString()自然会返回System.Action1[System.Action]`类型字符串,这就是你PDF里输出内容的来源。 - 变量命名混乱:你外层
ObservableCollection实例命名为PaidTrips,内层遍历theseTrips时的单个PaidTrip实体循环变量也命名为PaidTrips,且反射属性的循环变量直接取名为LicenseHolderID,多重命名混淆直接导致你逻辑判断出错。断点能看到正确值是因为你刚好停在遍历到LicenseHolderID属性的那次循环,后续遍历到其他属性时覆盖了变量n的值,最终写入PDF的是最后一次循环得到的类型字符串。 - 空值风险:你没有对反射获取的属性值做空判断,如果属性值为
null时调用ToString()会直接抛出空引用异常。
解决方案
方案1:无需反射,直接访问属性(推荐)
你明确需要的是LicenseHolderID属性的值,完全不需要用反射遍历所有属性,直接修改内层循环代码即可:
// 先修改循环变量名,避免和外层集合重名 foreach (PaidTrip trip in theseTrips) { // 直接访问属性拿值,不需要反射 string n = trip.LicenseHolderID; // 后续写PDF的逻辑 gfx.DrawString(n, new XFont("Arial", 40, XFontStyle.Bold), ridelGreen, new XPoint(40, 350)); }
方案2:确实需要遍历所有属性的处理方式
如果你有遍历所有属性输出的需求,需要过滤目标属性并添加空值判断:
foreach (PaidTrip trip in theseTrips) { foreach (var prop in trip.GetType().GetProperties()) { // 只处理你需要的目标属性,避免遍历到无关的Action类型属性 if (prop.Name == nameof(PaidTrip.LicenseHolderID)) { object value = prop.GetValue(trip); // 做空判断,避免空引用异常 string n = value?.ToString() ?? string.Empty; // 写PDF逻辑 gfx.DrawString(n, new XFont("Arial", 40, XFontStyle.Bold), ridelGreen, new XPoint(40, 350)); } } }
内容的提问来源于stack exchange,提问作者Ole M
相关产品推荐
相关产品推荐

