如何将ArrayList对象属性导入DataTable?泛型List写法是否可行?
我来帮你梳理这两个问题的解决方案:
问题1:如何从
ArrayList中引用对象的属性值? 因为ArrayList是非泛型集合,它存储的所有元素都是object类型,所以直接通过item.Company访问属性会编译失败——编译器不知道这个object具体是什么类型,自然无法识别它的属性。
解决方法是将item强制转换为你的实体类类型(比如你后面用到的CrmPartPrice),之后就能正常访问属性了。示例代码如下:
foreach (object item in crmUpdate) { // 显式将object转换为CrmPartPrice类型 CrmPartPrice crmItem = (CrmPartPrice)item; DataRow row = insertDt.NewRow(); // 现在可以正常访问属性了 row["Company"] = crmItem.Company; row["Contractid"] = crmItem.ContractId; row["ContractNumber"] = crmItem.ContractNumber; // 其他属性依次赋值... insertDt.Rows.Add(row); }
⚠️ 注意:如果crmUpdate集合中存在不是CrmPartPrice类型的对象,这种强制转换会抛出InvalidCastException,所以如果集合元素类型不确定,建议先做类型检查:
foreach (object item in crmUpdate) { if (item is CrmPartPrice crmItem) { DataRow row = insertDt.NewRow(); row["Company"] = crmItem.Company; // 其他属性赋值... insertDt.Rows.Add(row); } // 可以添加else逻辑处理非目标类型的元素 }
问题2:泛型集合
List<CrmPartPrice>的写法是否可行? 完全可行!而且这是更推荐的写法,相比ArrayList有很多优势:
- 类型安全:编译时就会检查集合元素的类型,避免运行时的类型转换异常;
- 无需强制转换:直接用
CrmPartPrice类型遍历,代码更简洁; - 性能更优:避免了
ArrayList中object类型的装箱/拆箱操作; - 可读性更高:从代码就能直接看出集合存储的是什么类型的对象。
你给出的代码框架是正确的,只需要补充完整所有属性的赋值即可,完整示例如下:
// 假设你已经正确定义了CrmPartPrice类,包含所有对应属性 List<CrmPartPrice> crmUpdate = new List<CrmPartPrice>(); // 注意:这里需要先填充crmUpdate的数据,比如从接口、数据库获取 foreach (CrmPartPrice item in crmUpdate) { DataRow row = insertDt.NewRow(); row["Company"] = item.Company; row["Contractid"] = item.ContractId; row["ContractNumber"] = item.ContractNumber; row["InstAgreeNum"] = item.InstAgreeNum; row["ProductNumber"] = item.ProductNumber; row["StartDate"] = item.StartDate; row["UpdatePrice"] = item.UpdatePrice; insertDt.Rows.Add(row); }
总结一下:泛型集合List<T>是现代C#开发中替代ArrayList的首选方案,建议优先使用它来避免类型转换的麻烦和潜在的运行时错误。
内容的提问来源于stack exchange,提问作者SqlKindaGuy
相关产品推荐
相关产品推荐

