You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 13:01:00