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

Dart类实现通用setField/getField方法时运算符报错问题咨询

解决Dart中通过字段名动态操作类属性的问题

Dart是强类型语言,不像JavaScript那样支持直接通过字符串索引访问对象属性(this["key"]),所以你直接用this[memberName]会触发报错。下面提供几种可行的实现方案:

方案一:手动字段映射(推荐,类型安全)

这种方式完全符合Dart的类型安全特性,适合字段数量不多的类,还能方便添加自定义校验逻辑:

class TestClass {
  String name;
  int age;

  TestClass({required this.name, required this.age});

  void setField({required String memberName, required dynamic value}) {
    // 可添加类型校验或业务逻辑
    switch(memberName) {
      case 'name':
        if (value is String) name = value;
        break;
      case 'age':
        if (value is int) age = value;
        break;
      default:
        throw ArgumentError('Unknown field: $memberName');
    }
  }

  dynamic getField({required String memberName}) {
    switch(memberName) {
      case 'name':
        return name;
      case 'age':
        return age;
      default:
        throw ArgumentError('Unknown field: $memberName');
    }
  }
}

void main() {
  TestClass test = TestClass(name: 'alaa', age: 14);
  
  test.setField(memberName: 'name', value: 'test name');
  test.setField(memberName: 'age', value: 16);
  
  print(test.getField(memberName: 'name')); // 输出: test name
  print(test.getField(memberName: 'age')); // 输出: 16
}

优点:类型安全、性能高、支持自定义校验;缺点:字段增多时需要手动维护分支逻辑。

方案二:使用dart:mirrors反射(不推荐Flutter场景)

Dart的反射库dart:mirrors可以实现动态属性访问,但Flutter不支持该库,且反射会带来性能开销和代码混淆风险:

import 'dart:mirrors';

class TestClass {
  String name;
  int age;

  TestClass({required this.name, required this.age});

  void setField({required String memberName, required dynamic value}) {
    InstanceMirror mirror = reflect(this);
    mirror.setField(Symbol(memberName), value);
  }

  dynamic getField({required String memberName}) {
    InstanceMirror mirror = reflect(this);
    return mirror.getField(Symbol(memberName)).reflectee;
  }
}

void main() {
  TestClass test = TestClass(name: 'alaa', age: 14);
  
  test.setField(memberName: 'name', value: 'test name');
  test.setField(memberName: 'age', value: 16);
  
  print(test.getField(memberName: 'name')); // 输出: test name
}

优点:无需手动维护字段映射;缺点:Flutter不兼容、性能差、破坏类型安全。

方案三:改用Map存储属性(简单灵活但无类型检查)

如果不需要严格的类型检查,可以直接用Map存储属性,模拟JavaScript的对象行为:

class TestClass {
  final Map<String, dynamic> _fields = {};

  TestClass({required String name, required int age}) {
    _fields['name'] = name;
    _fields['age'] = age;
  }

  void setField({required String memberName, required dynamic value}) {
    // 可添加自定义校验逻辑
    _fields[memberName] = value;
  }

  dynamic getField({required String memberName}) {
    return _fields[memberName];
  }
}

void main() {
  TestClass test = TestClass(name: 'alaa', age: 14);
  
  test.setField(memberName: 'name', value: 'test name');
  test.setField(memberName: 'age', value: 16);
  
  print(test.getField(memberName: 'name')); // 输出: test name
}

优点:实现简单、灵活;缺点:失去Dart的类型安全特性,无法在编译期发现类型错误。


内容的提问来源于stack exchange,提问作者Alaa M. Jaddou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:10:17