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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 23:42:55