C#中如何实现运行时通过变量动态访问对象属性?
实现C#动态访问对象属性的几种方法
针对你的需求,这里提供三种实用的实现方式,适配你提到的5种固定合法formType取值场景:
1. 字典映射法(推荐,类型安全+性能优)
如果formType的取值是固定的5种,最稳妥的方式是提前把initValues的属性和formType做映射,直接通过字典取值:
首先假设你的initValues类结构大概是这样(包含5个同类型的表单属性):
public class InitValues { public FormBase BusinessEventForm { get; set; } public FormBase OtherForm1 { get; set; } public FormBase OtherForm2 { get; set; } // 另外2个表单属性... } // 所有表单属性的基类,包含Event.Schedules结构 public class FormBase { public EventInfo Event { get; set; } } public class EventInfo { public List<Schedule> Schedules { get; set; } } public class Schedule { public DateTime EventDate { get; set; } }
然后在代码里创建字典映射,直接取值:
// 提前构建formType到属性的映射 var formMap = new Dictionary<string, FormBase> { {"BusinessEventForm", initValues.BusinessEventForm}, {"OtherForm1", initValues.OtherForm1}, {"OtherForm2", initValues.OtherForm2}, // 补充另外2种合法取值的映射 }; // 动态获取对应表单 if (formMap.TryGetValue(formType, out var targetForm)) { var eventDateValue = targetForm.Event.Schedules .Select(item => item.EventDate) .Single(); var eventDate = Utility.ToJson(eventDateValue); } else { // 处理非法formType的情况 }
这种方法类型安全,性能比反射好,还能清晰控制合法的formType范围。
2. Switch-Case分支法(直观,适合少量固定取值)
如果formType的取值非常少(比如你说的5种),直接用switch-case分支也很直观:
FormBase targetForm = formType switch { "BusinessEventForm" => initValues.BusinessEventForm, "OtherForm1" => initValues.OtherForm1, "OtherForm2" => initValues.OtherForm2, // 补充另外2种取值 _ => throw new ArgumentException("非法的formType值") }; var eventDateValue = targetForm.Event.Schedules .Select(item => item.EventDate) .Single(); var eventDate = Utility.ToJson(eventDateValue);
这种方法代码可读性强,调试方便,完全类型安全,适合取值固定且数量少的场景。
3. 反射法(最接近JS的动态访问,性能稍弱)
如果需要完全像JS那样通过字符串动态访问属性,可以用C#的反射实现:
// 获取initValues对象中名为formType的属性 var propertyInfo = initValues.GetType().GetProperty(formType); if (propertyInfo == null) { throw new ArgumentException("不存在对应的表单属性"); } // 将属性值转换为FormBase类型 var targetForm = (FormBase)propertyInfo.GetValue(initValues); var eventDateValue = targetForm.Event.Schedules .Select(item => item.EventDate) .Single(); var eventDate = Utility.ToJson(eventDateValue);
注意:反射的性能比前两种方法差一些,而且没有编译时类型检查,适合动态性要求高但性能要求不严格的场景。
内容的提问来源于stack exchange,提问作者Vipin Dubey
相关产品推荐
相关产品推荐

