2011-07-01 5 views
5

Mam 2 formanty jeden formularz: lista i drzewo (nazwy konkretnych typów są nieistotne).Przeciągnij i upuść niestandardowy obiekt

W sterowaniu listą wykonuję metodę DoDragDrop. Jako pierwszy argument przekazuję obiekt, który był danymi związanymi z tym wierszem. Obiekt implementuje określony interfejs i jest oznaczony atrybutem Serializable.

To, czego chcę, to odzyskanie tego obiektu w procedurze obsługi zdarzeń DragEnter/DragDrop kontrolki drzewa. Używam następujący kod:

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

Niestety, w wyniku danych jest nieważna i formatów jest tablicą jeden element, który posiada nazwę konkretnego typu (wykonawczego IFoo). Zakładam, że będę musiała przekazać dokładną nazwę typu do GetData, aby odzyskać obiekt, ale nie jest to możliwe, ponieważ jest to klasa prywatna.

Czy istnieje sposób na uzyskanie obiektu przez jego interfejs?

Odpowiedz

4

Musisz podać ten sam typ, co klasa, która była serializowana w pierwszej kolejności. Nie można użyć interfejsu ani klasy bazowej klasy serializowanej, ponieważ wtedy może pasować do niej więcej niż jeden format i nie będzie wiadomo, który z nich będzie deserializować. Jeśli masz kilka klas, które wszystkie implementują IFoo i istnieje instancja każdej z nich w obiekcie danych, to zapytanie o IFoo byłoby niejednoznaczne. Musisz więc zapytać o dokładny typ serializowany w obiekcie danych.

Oznacza to, że nie należy umieszczać klas w obiekcie danych, który nie może być przekształcany w postaci szeregowej, ponieważ są one prywatne na drugim końcu.