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

C# .NET中如何通过枚举实现动态对象属性访问?

如何通过枚举动态获取ViewBag中对象的属性值

你当前的写法无法实现预期效果,因为@case.Positive.@enumName会被Razor解析为字面量字符串拼接,而非动态访问对象属性,所以才会输出类似case.Negative的文本而非数据库记录值。要实现通过枚举动态获取属性值,可以用以下两种方式:

方式一:在Razor视图中使用反射直接获取

首先注意,case是C#关键字,建议把循环变量名改为caseItem避免编译错误。另外可以写一个辅助方法来获取枚举的Display名称:

@functions {
    // 获取枚举的Display属性名称
    private string GetEnumDisplayName(Enum enumValue)
    {
        var field = enumValue.GetType().GetField(enumValue.ToString());
        var displayAttr = field.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.DisplayAttribute), false)
                               .FirstOrDefault() as System.ComponentModel.DataAnnotations.DisplayAttribute;
        return displayAttr?.Name ?? enumValue.ToString();
    }
}

然后修改遍历逻辑,通过反射根据枚举名称获取对应属性值:

@foreach(var caseItem in ViewBag.Cases)
{
    <tr>
        @foreach(ResultsEnum enumVal in Enum.GetValues(typeof(ResultsEnum)))
        {
            // 获取枚举对应的属性名(比如Positive对应caseItem.Positive)
            string propName = enumVal.ToString();
            // 反射获取属性值
            object propValue = caseItem.GetType().GetProperty(propName)?.GetValue(caseItem);
            // 获取枚举的显示名称
            string displayName = GetEnumDisplayName(enumVal);
            
            <td>@displayName: @propValue</td>
        }
    </tr>
}

方式二:后端提前处理数据(推荐)

视图层尽量避免复杂逻辑,推荐在Controller中提前把数据转换为适配枚举的结构,比如创建ViewModel:

// 定义ViewModel
public class CaseResultVM
{
    public Dictionary<ResultsEnum, object> ResultValues { get; set; }
    // 其他需要展示的属性
}

在Controller中处理原始数据:

// 假设dbCases是从数据库查询到的原始集合
var processedCases = dbCases.Select(caseObj => new CaseResultVM
{
    ResultValues = Enum.GetValues(typeof(ResultsEnum))
                       .Cast<ResultsEnum>()
                       .ToDictionary(
                           enumVal => enumVal,
                           enumVal => caseObj.GetType().GetProperty(enumVal.ToString())?.GetValue(caseObj)
                       )
}).ToList();

ViewBag.Cases = processedCases;

然后在视图中直接遍历处理好的数据:

@foreach(var caseItem in ViewBag.Cases)
{
    <tr>
        @foreach(var kvp in caseItem.ResultValues)
        {
            string displayName = GetEnumDisplayName(kvp.Key);
            <td>@displayName: @kvp.Value</td>
        }
    </tr>
}

关键说明

你之前的写法错误在于,Razor无法将字符串形式的属性名直接解析为对象的成员访问,必须通过反射来动态获取属性值,或者在后端提前完成数据结构的转换,才能实现枚举驱动的属性遍历。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 23:45:37