如何在ASP.NET Core中用参数替代Component模型的Storage属性?
Component是一个模型类,Storage是它的其中一个属性。请问能不能用传入的参数替代代码里硬写的Storage,来实现动态属性的数据过滤?现有代码如下:
public IActionResult Filtered(string parameter) { return View(viewModel.Where(x => x.Component.Storage != "").ToList()); }
当然可以,分享两种常用实现思路:
1. 反射实现动态属性过滤
如果属性名称完全由外部参数决定,没法提前预判,用反射来动态获取属性值是最直接的方式:
public IActionResult Filtered(string parameter) { // 先做参数校验,避免传入无效属性名 if (string.IsNullOrWhiteSpace(parameter)) return BadRequest("参数不能为空"); var filteredData = viewModel.Where(item => { // 获取Component的指定属性 var prop = item.Component.GetType().GetProperty(parameter); if (prop == null) return false; // 不存在的属性直接过滤掉,也可以抛错 var value = prop.GetValue(item.Component)?.ToString(); // 和原逻辑保持一致,过滤非空字符串 return !string.IsNullOrEmpty(value); }).ToList(); return View(filteredData); }
⚠️ 注意:反射的性能比直接调用属性稍差,如果这个接口是高并发场景,建议考虑下面的方案。
2. 枚举已知属性做静态映射
如果需要过滤的属性是固定的几个(比如只有Storage、Memory、Capacity这几个),用字典映射的方式更高效,还能保证类型安全:
// 先假设你的ViewModel类型叫YourViewModel public IActionResult Filtered(string parameter) { // 定义过滤逻辑的映射 var filterMap = new Dictionary<string, Func<YourViewModel, bool>> { ["Storage"] = x => !string.IsNullOrEmpty(x.Component.Storage), ["Memory"] = x => !string.IsNullOrEmpty(x.Component.Memory), ["Capacity"] = x => x.Component.Capacity > 0 // 不同类型属性的判断逻辑可以自定义 }; // 找对应的过滤逻辑,没有的话返回空列表或者报错 if (!filterMap.TryGetValue(parameter, out var filter)) return View(new List<YourViewModel>()); return View(viewModel.Where(filter).ToList()); }
这种方式没有反射的性能损耗,而且编译时就能检查属性名称是否正确,不容易出运行时bug,推荐在属性范围明确的场景下使用。
内容的提问来源于stack exchange,提问作者E__
相关产品推荐
相关产品推荐

