C#中如何将LINQ查询生成的对象List作为方法参数传递
问题根因
你传参失败有两个直接原因:
- 代码本身有语法错误:
loadReceptionData方法里无意义嵌套了一行没写完的private void loadReceptionGrid,本身就没法编译;同时LINQ语句里范围变量写的是AFspraken,后面调用属性用的是Afspraken,大小写不匹配也会报错。 - LINQ用
select new {}生成的是匿名类型集合,List<匿名类型>不支持直接隐式转换为List<Object>:C#中List<T>是不变泛型类型,就算两个类型有继承关系,对应的List也不能直接转换,更何况匿名类型你没法在方法签名里写出它的准确类型。
可行解决方案
方案1:改方法参数类型(最省事,适配数据绑定场景)
你写changeDataviewReception方法的唯一作用是给DataGridView绑数据源,控件本身不需要强类型集合,直接把参数类型改成object或者非泛型IEnumerable就行,连匿名类型的结构都不用改:
private void loadReceptionData() { // 删掉多余的嵌套方法声明,修正LINQ变量大小写笔误 var receptionToFinnish = (from afspraak in dataAfspraken where afspraak.factuur_betaald && !afspraak.volledig_afgerond join user in dataUsers on afspraak.gekoppelde_klant equals user.id select new { Id = afspraak.id, Klant = user.gebruikersnaam, Betaald = afspraak.factuur_betaald, Afgerond = afspraak.volledig_afgerond }).ToList(); changeDataviewReception(receptionToFinnish); } // 直接收object类型参数即可,不需要强转List<object> private void changeDataviewReception(object listData) { dgvReceptionData.DataSource = listData; }
这个方案不需要额外定义类,DataGridView会通过反射自动读取匿名类型的属性生成列,绑定效果和强类型完全一致。
方案2:定义专用视图模型类(最规范,适合后续扩展)
如果后续你还要对网格数据做增改、校验、筛选等逻辑,不要用匿名类型,单独定义一个网格专用的DTO类:
// 接待网格数据传输类 public class ReceptionGridRow { public int Id { get; set; } public string Klant { get; set; } public bool Betaald { get; set; } public bool Afgerond { get; set; } }
修改LINQ语句,投影时直接生成这个强类型的集合:
var receptionToFinnish = (from afspraak in dataAfspraken where afspraak.factuur_betaald && !afspraak.volledig_afgerond join user in dataUsers on afspraak.gekoppelde_klant equals user.id select new ReceptionGridRow { Id = afspraak.id, Klant = user.gebruikersnaam, Betaald = afspraak.factuur_betaald, Afgerond = afspraak.volledig_afgerond }).ToList(); // 这时候参数直接用强类型列表,完全类型安全 private void changeDataviewReception(List<ReceptionGridRow> listData) { dgvReceptionData.DataSource = listData; }
方案3:强制转换为object列表(不推荐,仅兼容旧逻辑用)
如果你因为其他原因必须保留List<Object>的方法签名,调用时手动用LINQ转一次类型即可:
changeDataviewReception(receptionToFinnish.Cast<object>().ToList());
这种写法会额外生成一份新的列表拷贝,有性能损耗,还会丢失所有类型信息,非必要不要用。
内容的提问来源于stack exchange,提问作者NoBodyHadThisProblem
相关产品推荐
相关产品推荐

