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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:42:42