C#如何获取对象属性名与值并动态添加到指定列表
实现方案
直接用C#反射遍历目标ViewModel的所有公共实例属性,动态生成属性名值对,完全替代手动逐个赋值的写法,后续BookVM新增/删除属性也不需要修改这段赋值逻辑。
修改后可直接运行的代码
public class ParametersList { public string Name { get; set; } public dynamic Value { get; set; } } public class BookVM { public string AuthorName{ get; set; } public string CoverUrl { get; set; } public int AuthorIds { get; set; } } public List<Book> Addgetallbooks(BookVM BookVM) { List<ParametersList> obj = new List<ParametersList>(); // 反射获取BookVM的所有公共实例属性 var properties = typeof(BookVM).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); foreach (var prop in properties) { obj.Add(new ParametersList { Name = prop.Name, Value = prop.GetValue(BookVM) }); } var getdata = _opr.GetBooks1(obj); return getdata; }
补充说明
- 这段代码的执行效果和你注释里手动写的赋值逻辑完全一致,属性名取属性本身的定义名,取值是传入的BookVM实例对应属性的实时值
- 后续BookVM增减属性时,这段逻辑不需要做任何修改,会自动适配新的属性结构
- 如果需要排除指定属性,只要在循环内加对应判断跳过即可,比如要排除CoverUrl就加
if(prop.Name == nameof(BookVM.CoverUrl)) continue; - 普通业务场景下这点反射开销完全可以忽略,如果是超高频调用的场景,可以提前把PropertyInfo集合缓存起来进一步优化性能
内容的提问来源于stack exchange,提问作者M. Rizwan
相关产品推荐
相关产品推荐

