如何用C#从指定字符串数组构建匿名类型?
动态筛选属性构建类实例的可行方案
匿名类型是编译时静态确定的,无法在运行时动态生成包含指定属性的匿名类型。如果需要实现「仅保留指定属性名的属性」的需求,可以根据场景选择以下原生实现方法:
方案一:使用ExpandoObject构建动态对象(运行时动态属性)
适合属性列表在运行时才确定的场景,生成的对象可以像匿名类型一样通过属性名访问成员:
var propertyArray = new[] { "property1", "property3" }; var result = primaryObject.Select(m => { dynamic expando = new ExpandoObject(); var expandoDict = (IDictionary<string, object>)expando; // 筛选匹配的属性并赋值 foreach (var prop in m.GetType().GetProperties().Where(p => propertyArray.Contains(p.Name))) { expandoDict[prop.Name] = prop.GetValue(m); } return expando; });
- 优点:完全支持运行时动态指定属性列表,使用方式接近匿名类型
- 缺点:属于动态类型,编译时没有属性检查,性能略低于静态类型
方案二:编译时确定属性列表的静态投影
如果属性列表在编译时就已知,直接手动指定属性是性能最优的方案(即你当前的做法),写法简洁且类型安全:
// 编译时已知要保留property1、property3 var result = primaryObject.Select(m => new { m.property1, m.property3 });
- 优点:编译时类型安全,性能最佳
- 缺点:无法支持运行时动态变更属性列表
方案三:使用字典存储属性键值对
如果不需要像对象属性那样访问成员,也可以直接返回字典结构:
var propertyArray = new[] { "property1", "property3" }; var result = primaryObject.Select(m => { return m.GetType().GetProperties() .Where(p => propertyArray.Contains(p.Name)) .ToDictionary(p => p.Name, p => p.GetValue(m)); });
- 优点:实现简单,不需要依赖动态类型
- 缺点:访问成员需要通过字典键(如
dict["property1"]),不如属性访问直观
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

