为何匿名类型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
相关产品推荐
相关产品推荐

