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

如何从C#对象的Dynamic View中获取动态成员及成员值?

嘿,我来帮你搞定这个问题!你已经通过查询拿到了buyingCompanies数组,现在要提取里面的动态成员和对应的值,有几种实用的方法,我给你一步步讲清楚:

方法1:直接用dynamic类型访问(已知成员名称时)

如果已经知道要提取的动态成员名称,直接把数组元素转成dynamic类型就能快速访问值,非常直观:

foreach (var item in buyingCompanies)
{
    dynamic dynamicCompany = item;
    // 直接访问已知的动态成员,比如你的u_seller_id
    string sellerId = dynamicCompany.u_seller_id;
    Console.WriteLine($"卖家ID: {sellerId}");

    // 如果你还想看看其他所有动态成员,可以结合反射遍历
    var allProperties = dynamicCompany.GetType().GetProperties();
    foreach (var prop in allProperties)
    {
        string memberName = prop.Name;
        object memberValue = prop.GetValue(dynamicCompany);
        Console.WriteLine($"动态成员: {memberName}, 值: {memberValue}");
    }
}
方法2:用反射遍历所有动态成员(未知成员名称时)

如果不确定有哪些动态成员,反射是通用解决方案——它能获取对象的所有公共属性(包括动态生成的),不管你有没有提前知道成员名称:

using System.Reflection;

// 遍历buyingCompanies里的每个对象
foreach (var company in buyingCompanies)
{
    Type companyType = company.GetType();
    // 获取所有实例级别的公共属性
    PropertyInfo[] properties = companyType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
    
    foreach (PropertyInfo prop in properties)
    {
        string memberName = prop.Name;
        object memberValue = prop.GetValue(company);
        
        // 这里可以根据业务需求处理,比如存入字典、打印等
        Console.WriteLine($"成员名称: {memberName}, 对应值: {memberValue}");
    }
}
方法3:针对ExpandoObject的特殊处理(如果适用)

如果你的动态视图对象本质是ExpandoObject(有些ORM或动态框架会返回这种类型),可以直接转成IDictionary<string, object>来遍历,效率比反射更高:

foreach (var company in buyingCompanies)
{
    if (company is ExpandoObject expandoCompany)
    {
        var memberDict = expandoCompany as IDictionary<string, object>;
        foreach (var kvp in memberDict)
        {
            Console.WriteLine($"成员: {kvp.Key}, 值: {kvp.Value}");
        }
    }
    else
    {
        // 如果不是ExpandoObject,就 fallback 到反射方法
        Type companyType = company.GetType();
        var properties = companyType.GetProperties();
        foreach (var prop in properties)
        {
            Console.WriteLine($"成员: {prop.Name}, 值: {prop.GetValue(company)}");
        }
    }
}

额外小提示

  • 调试器里的「Dynamic View」有时候会展示一些系统内部属性,如果你只想提取业务相关的动态成员(比如你代码里的u_前缀字段),可以在遍历的时候加个判断:if (prop.Name.StartsWith("u_"))
  • 如果你的buyingCompanies其实是强类型对象,只是调试器显示了Dynamic View,上面的方法依然适用——反射能拿到所有公共属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:01:15