С# SQL CLR Project - элементы Public Generic.List отображаются как непубличные члены в отладчике

У меня возникла проблема в проекте C# SQL CLR, где публично объявленные элементы Generic.List не отображаются как общедоступные в отладчике. Это проблематично, потому что я пытаюсь сериализовать объект в XML. В реальном проекте есть несколько сложных объектов, но очень простой пример будет выглядеть примерно так:

[Microsoft.SqlServer.Server.SqlProcedure]
public static void DoSomething()
{

    // the Thing Object has a public property of List<string> 
    // that is created in the constructor
    Thing t = new Thing();

    t.Items.Add("test");
    t.Items.Add("test2");

    // now, if I look at t in the debugger, it has given the
    // items list a capacity of 4 and shows the items as
    // non-public members (2 with values and 2 that are null)

}

Я хотел опубликовать здесь изображение из отладчика, но, похоже, я не могу сделать это как новый пользователь...

С учетом всего сказанного, такое поведение связано с тем, что это проект SQL CLR? Тот же код отлично работал при разработке в консольном приложении (хотя я мог что-то напутать, добавляя его в проект CLR).

Добавление дополнительной информации об объекте Thing — оно включает следующее объявление для Items:

public List<string> Items { get; set; }

Затем в отладчике элементы просто показывают емкость и количество (без реальных элементов или свойств для элементов). Фактические экземпляры элементов перечислены в разделе «Непубличные члены».


person snow_FFFFFF    schedule 27.01.2014    source источник
comment
Вы смотрите на свойство Items или на внутренний/частный резервный массив?   -  person Blorgbeard    schedule 28.01.2014
comment
Исходное сообщение было обновлено, чтобы прояснить вопрос Blorgbeard. Итак, я получаю доступ к свойству Items (но не могу видеть их как общедоступные члены в отладчике, что означает, что xmlserializer также не может их видеть).   -  person snow_FFFFFF    schedule 28.01.2014
comment
Вы получаете сообщение об ошибке при сериализации XML?   -  person Jon Hanna    schedule 28.01.2014
comment
Не ошибка, просто нет значений. Несмотря на то, что мои элементы являются общедоступными, в проекте CLR фактические экземпляры в списке не являются общедоступными (и поэтому не сериализуются).   -  person snow_FFFFFF    schedule 28.01.2014
comment
Это означает, что нет такой вещи, поэтому проблема с сериализацией, вероятно, имеет другую причину; сериализация не работает так же, как отладчики, когда речь идет об индексированных свойствах — свойство является общедоступным, но оно не возвращает значение без передачи индекса, поэтому отладчик не может запросить его, если только отладчик не поддерживает использование прокси для запроса чего-то еще.   -  person Jon Hanna    schedule 28.01.2014


Ответы (1)


Само свойство Items никогда не будет видно отладчику, потому что это индексированное свойство, поэтому нет значения, которое вы можете просто получить для него, и, следовательно, проверка возвращаемого им значения не имеет смысла. иметь смысл (как проверка 30 февраля или невыполненных обещаний политика; его просто не существует).

List<T> использует атрибут DebuggerTypeProxyAttribute для определения другого класса, который будет использоваться для представления отладчика. Этот класс (один внутренний для mscorlib) имеет общедоступное свойство Items, которое возвращает массив с копией элементов списка, так что похоже, что вы действительно можете проверить свойство Items List<T>, когда на самом деле вы изучаете свойство Items объекта. который копирует элементы при вызове.

Отладчикам не обязательно использовать этот подход, поэтому, возможно, тот, который вы используете, не поддерживает, или есть какие-то другие ограничения, но если вы используете отладчик, который не поддерживает DebuggerTypeProxy, вы можете просто проверить закрытый член, в котором хранится элементы в массиве (массив будет не меньше Count и, возможно, немного больше, чтобы оставить место для роста, а не изменять размер для каждого Add; вы можете игнорировать элементы за пределами Count - 1).

Это не имеет ничего общего с сериализацией XML, поэтому любая проблема, с которой вы сталкиваетесь, скорее всего, совершенно не связана.

Редактировать:

Я вижу, что у некоторых людей возникают другие проблемы с сериализацией XML и SQL CLR, например:

SQL Server не находит сборку сериализации

http://connect.microsoft.com/VisualStudio/feedback/details/753005/when-deploying-a-sqlclr-assembly-with-a-generated-xmlserializer-assembly-the-xmlserializer-assembly-assembly-should-be-deployed

http://social.msdn.microsoft.com/Forums/sqlserver/en-US/3fa5dce3-b0f3-44f8-9b7b-65439f1c98ae/cannot-deploy-xmlserializers-clr-assemblies?forum=ssdt< /а>

http://social.msdn.microsoft.com/Forums/sqlserver/en-US/e6560fa4-76f1-4da2-b795-7926d0743baa/sql-clr-problem-with-xmlserializer?forum=sqlnetfx< /а>

Ваша проблема с XML действительно отличается от вашей проблемы с представлением отладчика. (Тем временем я собираюсь добавить прокси-серверы отладчика в некоторые из моих типов коллекций, я всегда полагал, что люди просто перейдут к внутренним членам и им все равно, но вы заставили меня переосмыслить это).

person Jon Hanna    schedule 27.01.2014
comment
Джон - спасибо за понимание. Это звучит очень близко к тому поведению, которое я вижу, но я все же думаю, что здесь есть проблема (или ограничение в типе проекта CLR). Вы правы, что я могу проверить частную коллекцию _items, но общедоступных элементов там нет. Тот же объект может иметь общедоступную строку x, и он будет нормально сериализован. Однако общедоступный список‹строка› не будет. Одно и то же определение объекта ведет себя иначе в проекте консоли или winform, чем в проекте CLR. - person snow_FFFFFF; 28.01.2014
comment
Я хотел бы опубликовать снимок экрана, потому что он показывает очень разное поведение во время выполнения между разными типами проектов. - person snow_FFFFFF; 28.01.2014
comment
@user3242103 user3242103 вы можете опубликовать его в любой службе загрузки изображений и добавить ссылку на него в качестве редактирования исходного вопроса, пользователь с большим числом представителей придет, отредактирует ваш вопрос и превратит ссылку в полное изображение. - person Scott Chamberlain; 28.01.2014
comment
Джон, мой фактический код был немного сложнее (и, по-видимому, с ошибками), чем упрощенный пример. Я начал новый проект с нуля и использовал упрощенный пример: поведение отладчика такое же, но сериализация выполняется правильно. Это соответствует вашему объяснению и означает, что у меня более глубокая проблема в моем реальном коде. Я был уверен, что это что-то другое, просто потому, что представление отладчика, казалось, соответствовало моей проблеме в дополнение к тому факту, что отладчик вел себя по-разному для проектов Console или WinForm. - person snow_FFFFFF; 28.01.2014
comment
Отладчики могут быть инструментами-обманщиками; они чрезвычайно полезны, но я думаю, что мы все в какой-то момент потратили время, пытаясь исправить артефакт поведения отладчика, который мы мысленно связывали с реальной проблемой, которая заставила нас использовать отладчик в первую очередь. Тем не менее, спасибо за понимание того, как другие используют отладчики (я часто использую отладчик, который никогда не использует прокси-серверы, поэтому я забываю о них, но я должен больше думать о тех пользователях, которые их ожидают). Желаю удачи в вашей проблеме с сериализацией. - person Jon Hanna; 28.01.2014