Перетащите пользовательский объект - PullRequest
4 голосов
/ 01 июля 2011

У меня есть 2 элемента управления, одна форма: список и дерево (имена определенных типов не имеют значения).

В элементе управления списком я выполняю метод DoDragDrop.В качестве первого аргумента я передаю объект, который был связан с данными этой строки.Объект реализует определенный интерфейс и помечен атрибутом Serializable.

Я хочу получить этот объект в обработчике событий DragEnter / DragDrop элемента управления tree.Я использую следующий код:

void TreeControlDragEnter(object sender, DragEventArgs e)
{
    var formats = e.Data.GetFormats();
    var data = e.Data.GetData(typeof (IFoo));
}

К сожалению, в результате данные имеют нулевое значение, а форматы представляют собой одноэлементный массив, содержащий имя определенного типа (реализующий IFoo).Я предполагаю, что мне нужно было бы передать точное имя типа в GetData для извлечения объекта, но это невозможно, поскольку это закрытый класс.

Есть ли способ получить объект по его интерфейсу?

1 Ответ

3 голосов
/ 02 июля 2011

Вы должны предоставить тот же тип, что и класс, который был сериализован в первую очередь.Вы не можете использовать интерфейс или базовый класс сериализованного класса, потому что тогда ему может соответствовать несколько форматов, и он не будет знать, какой десериализовать.Если у вас есть несколько классов, которые все реализуют IFoo, и есть экземпляр каждого из них внутри объекта данных, то запрос IFoo будет неоднозначным.Поэтому вы должны запросить точный тип, который был сериализован в объект данных.

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

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