Как сохранить ссылку на объект в System.DataTable, а не на строку? - PullRequest
0 голосов
/ 20 января 2019

Я написал эту программу:

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 - строковым массивом, чтобы избежать все это замешательство?

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Этого можно избежать, просто указав тип данных столбца при добавлении столбца в таблицу данных.

* 1003 т.е. *

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 (Online .Net Compiler)

0 голосов
/ 20 января 2019

Это потому, что вы добавили Column1 без указания его типа, поэтому по умолчанию ему будет присвоен string.

Попробуйте явно установить вместо него Object:

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

См. Источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...