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

如何在Dart中将类属性作为计算函数的输入参数?

通用属性求和函数实现方案

需求背景

现有包含多个int类型属性的ListData类,目前为每个属性单独编写求和函数,希望实现一个通用计算函数,通过传入目标属性来避免重复代码。

核心实现方案

在Dart中,无法直接将类属性作为变量传入函数,但可以通过传递Getter函数的方式实现通用求和,让函数动态获取每个对象的目标属性值。

通用求和函数代码

int sumItemValue(List<ListData>? list, int Function(ListData) getValue) {
  // 处理空列表/空引用的情况,避免空指针
  if (list == null || list.isEmpty) return 0;
  return list.fold(0, (sum, item) => sum + getValue(item));
}

调用示例

调用时传入一个lambda函数(或Getter引用)来指定要求和的属性:

// 求和value1
int totalValue1 = sumItemValue(listOfData, (item) => item.value1);
// 求和value2
int totalValue2 = sumItemValue(listOfData, (item) => item.value2);
// 求和value3
int totalValue3 = sumItemValue(listOfData, (item) => item.value3);

更优雅的扩展方法实现

可以给List<ListData>?添加扩展方法,让调用更直观:

extension ListDataSumExtension on List<ListData>? {
  int sumBy(int Function(ListData) getValue) {
    if (this == null || this!.isEmpty) return 0;
    return this!.fold(0, (sum, item) => sum + getValue(item));
  }
}

调用时直接通过列表对象调用:

int totalValue1 = listOfData.sumBy((item) => item.value1);
int totalValue2 = listOfData.sumBy((item) => item.value2);

关键说明

你期望的sumItemValue(listOfData, ListData.value2)写法无法实现,因为ListData.value2不是一个可传递的变量——它是类的属性名称,Dart不支持直接将属性名作为参数传递。通过Getter函数间接获取属性值,是兼顾类型安全和代码复用的最优方案。


内容的提问来源于stack exchange,提问作者Dan12314

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 07:42:11