如何在 System.DataTable 中存储对对象的引用,而不是字符串



我写了这个程序:

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 限制为字符串数组并避免所有这些混淆?

那是因为您添加了Column1而不表示其类型,因此默认情况下它将被分配string

尝试将其显式设置为 Object

dt.Columns.Add("Column1", typeof(Object));

见来源

向数据表添加列时,只需定义列的数据类型即可避免这种情况。

dt.Columns.Add("Column1",typeof(object));

如果您没有指定列的数据类型,那么默认情况下它将是字符串。参考文章

试试这段代码,你会看到魔术。 :)

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编译器)

最新更新