如何根据一个字符串去查找同名的对象?

本文分享了一种在项目中利用ECharts动态加载不同图表的方法。通过将图表配置信息存储在按钮的自定义属性中,并结合JavaScript的属性访问表达式技巧,实现了根据不同按钮点击加载对应图表的功能。

在做项目的时候,遇到一个情景:有多个按钮,点击不同的按钮实现添加不同的echars图表。然后在一开始的时候我采用的是给每个按钮设定不同的class。再根据选择器绑定事件,调用方法,实际上方法都一样,但是就有一个setOption ( option) 中的这个option不同就像下图那样


(至于为什么外面选择器用的jQuery 里面的却用原生的……咳咳,因为不知道为什么echart用jQuery选择器会报错,而且jQuery在添加事件,增删class方面实在是太方便了)


后来经过交流群里面的大神指点,把option的划分放在标签自定义属性中,然后根据属性值去调用不同的option。一时我感觉前方万丈光芒,豁然开朗,刷刷刷砍掉大部分代码,改成这样:


兴高采烈一运行,懵逼了,报错了! 然后本能的console 一下typeof  发现数据类型是string。第一反应是想着怎么去将字符串转为对象。想到了eval() ,想到了JSON.parse()

因为我记得有一句话叫eval() is evil 所以我就先试试JSON.parse() ,但是不行;又用了eval() 还是不行;但是数据类型明确是转换过来了,成为了 Object;

为什么呢?

因为他们虽然同名同姓,但不是同一个对象啊!


然后,回到起点了,怎么通过这个字符串去匹配同名的对象呢?

(重点来了)

突然想起来了一个知识点: 属性访问表达式!

访问一个属性,有两种格式:

1、也是最常用的一种   表达式.标识符

2、本文要介绍的用法  表达式[表达式]

用书上的话来说:

方括号内是另一个表达式(这种方法适用于对象和数组),指定要访问的属性的名称或者代表要访问数组元素的索引。这种语法看起来更像是数组,只是这个数组元素是通过字符串索引而不是数字索引。在这里,会计算方括号内的表达式的值并且转换成字符串。{ 所以这大概就是可以实现根据字符串去查找同名对象的原因了吧 }犀牛书第六版6.2中提到,方括号内的表达式必须返回字符串或者返回一个可以转换为字符串的值。
所以在这里使用字符串是合法的,因为本来就是要求可以被转换为字符串的值。
所以就能够实现通过字符串去查找同名的对象

ps: 博客生手,写的不好,请多多见谅,有写的错误的地方请一定指正,谢谢! 原创手打,转载注明

在C#中,可以通过反射机制来查找某个类是否存在与给定字符串同名的变量。反射允许程序在运行时动态地获取类型信息并操作对象的成员。要实现该功能,可以使用`Type.GetField()`方法,并结合适当的绑定标志(BindingFlags)来控制搜索范围和行为。 以下是一个完整的示例,演示如何通过反射检查类中是否存在与指定字符串名称匹配的字段: ```csharp using System; using System.Reflection; public class MyClass { public string Name = "John"; private int age = 30; public static string Category = "General"; } class Program { static void Main() { // 要查找的字段名称 string fieldNameToFind = "Name"; // 获取目标类型的Type对象 Type targetType = typeof(MyClass); // 使用GetField方法查找公共实例字段 FieldInfo publicField = targetType.GetField(fieldNameToFind, BindingFlags.Public | BindingFlags.Instance); if (publicField != null) { Console.WriteLine($"找到公共字段 '{fieldNameToFind}'"); } else { Console.WriteLine($"未找到公共字段 '{fieldNameToFind}'"); } // 查找私有实例字段 FieldInfo privateField = targetType.GetField(fieldNameToFind, BindingFlags.NonPublic | BindingFlags.Instance); if (privateField != null) { Console.WriteLine($"找到私有字段 '{fieldNameToFind}'"); } else { Console.WriteLine($"未找到私有字段 '{fieldNameToFind}'"); } // 查找静态字段 FieldInfo staticField = targetType.GetField(fieldNameToFind, BindingFlags.Public | BindingFlags.Static); if (staticField != null) { Console.WriteLine($"找到静态字段 '{fieldNameToFind}'"); } else { Console.WriteLine($"未找到静态字段 '{fieldNameToFind}'"); } } } ``` ### 解释 1. **`typeof(MyClass)`**:获取表示`MyClass`类型的`Type`对象。 2. **`BindingFlags`**: - `BindingFlags.Public` 表示搜索公共成员; - `BindingFlags.NonPublic` 表示搜索非公共(私有)成员; - `BindingFlags.Instance` 表示搜索实例字段; - `BindingFlags.Static` 表示搜索静态字段。 3. **`GetField()`**:此方法用于根据名称和绑定标志查找字段。如果找不到匹配项,则返回`null`。 4. **条件判断**:根据返回的`FieldInfo`对象是否为`null`,判断字段是否存在。 上述代码展示了如何分别查找公共、私有和静态字段[^3]。可以根据具体需求调整`BindingFlags`参数组合,以覆盖不同的访问级别和字段类型。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值