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

为何匿名类型BatchNo属性类型为object?如何获取实际隐式类型?

问题原因

你得到object类型是因为显式指定了Field方法的泛型参数为object,匿名类型的属性类型会严格遵循赋值时的表达式类型,而非底层数据的实际类型。r.Field<object>("BatchNo")的返回类型就是object,所以匿名类型的BatchNo属性自然被推断为object。

解决办法

1. 显式指定正确的泛型类型

既然数据表的BatchNo列是string类型,直接在Field方法中指定string作为泛型参数,匿名类型的BatchNo属性就会被推断为string:

var table = new DataTable();
table.Columns.Add(new DataColumn("BatchNo", typeof(string)));
table.Rows.Add(new[] { "001" });
var data = table.AsEnumerable().Select(r =>
        new
        {
            BatchNo = r.Field<string>("BatchNo"), // 这里指定string类型
        }
).ToList();
var type = data[0].GetType();
var prop = type.GetProperty("BatchNo");
var propType = prop.PropertyType; // 此时propType为string类型

2. 若需动态适配字段类型(谨慎使用)

如果不确定字段类型,希望匿名类型属性自动匹配实际值的类型,可以直接使用索引器取值,但要注意DataRow索引器返回的是object,若列中存在DBNull值需要额外处理:

var data = table.AsEnumerable().Select(r =>
        new
        {
            BatchNo = r["BatchNo"] is DBNull ? null : r["BatchNo"],
        }
).ToList();

不过这种情况下,即使列中所有值都是string,匿名类型的BatchNo属性仍会被推断为object——因为r["BatchNo"]的编译时类型是object。所以更可靠的方式还是显式指定Field的泛型类型。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 23:30:15