我已经编写了该程序:
using System;
using System.Data;
public class Program
{
public static void Main()
{
using (var dt = new DataTable())
{
// the data in the table - one row one column
var person = new
{
Name = "ABC",
Age = 24
};
// setup data table
dt.Columns.Add("Column1");
var row = dt.NewRow();
row["Column1"] = person;
dt.Rows.Add(row);
// assert
var storedPerson = dt.Rows[0]["Column1"];
if(!ReferenceEquals(dt.Rows[0].ItemArray[0], storedPerson))
throw new Exception();
if(!ReferenceEquals(storedPerson, person)){
Console.WriteLine("What is going on?");
Console.WriteLine($"Person is stored as a [{storedPerson.GetType().Name}]!");
Console.WriteLine($"Why is it not of type: [{person.GetType().Name}]?");
}
}
}
}
您可以在这里运行:https://dotnetfiddle.net/LzHPs1
我希望没有异常,也没有输出,但是我实际上得到了:
What is going on?
Person is stored as a [String]!
Why is it not of type: [<>f__AnonymousType0`2]?
当对象插入行时,数据表类是否应该在对象上调用ToString()?
我可以避免它并存储对该对象的引用吗?如果可以的话,我该怎么办?如果不能确定Microsoft是否可以限制行值的分配,使其仅接受字符串,而索引的返回类型为字符串,而ItemArray为字符串数组,则避免所有这些困惑?
答案 0 :(得分:1)
那是因为您添加了Column1
却没有指明其类型,因此默认情况下将为其分配string
。
尝试将其明确设置为Object
:
dt.Columns.Add("Column1", typeof(Object));
请参见Source
答案 1 :(得分:1)
在向数据表中添加列时,只需定义列的数据类型即可避免这种情况。
即
dt.Columns.Add("Column1",typeof(object));
如果您未指定column的数据类型,则默认为 string 。 Reference Article
尝试此代码,您将看到魔术。 :)
using System;
using System.Data
public class Program
{
public static void Main()
{
using (var dt = new DataTable())
{
// the data in the table - one row one column
var person = new
{
Name = "ABC",
Age = 24
};
// setup data table
dt.Columns.Add("Column1",typeof(object));
var row = dt.NewRow();
row["Column1"] = person;
dt.Rows.Add(row);
// assert
var storedPerson = dt.Rows[0]["Column1"];
if(!ReferenceEquals(dt.Rows[0].ItemArray[0], storedPerson))
throw new Exception();
if(!ReferenceEquals(storedPerson, person)){
Console.WriteLine("What is going on?");
Console.WriteLine($"Person is stored as a [{storedPerson.GetType().Name}]!");
Console.WriteLine($"Why is it not of type: [{person.GetType().Name}]?");
}
}
}
}
您可以在这里运行:https://dotnetfiddle.net/y84NCh(在线.Net编译器)