代码之家  ›  专栏  ›  技术社区  ›  Jamie Twells

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

  •  1
  • Jamie Twells  · 技术社区  · 6 年前

    我写了这个程序:

    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()?

    我可以避免它并存储对对象的引用吗?如果可以的话,我该怎么做呢?如果我不能确定,微软可能会将行值的赋值限制为只接受字符串,将索引的返回类型设置为字符串,将itemArray设置为字符串数组,并避免所有这些混淆。

    2 回复  |  直到 6 年前
        1
  •  1
  •   haim770    6 年前

    那是因为你添加了 Column1 不指示其类型,因此默认情况下将分配 string .

    尝试将其显式设置为 Object 而是:

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

    Source

        2
  •  1
  •   Hammad Sajid    6 年前

    在向数据表中添加列时,可以通过定义列的数据类型来避免这种情况。

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

    如果未指定列的数据类型,则默认为 一串 . 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编译器)