2011-07-01 20 views
5

que tienen 2 controles uno una forma: Lista y un árbol (nombres de tipos específicos son irrelevantes).arrastrar y soltar objetos personalizados

En el control de lista ejecuto método DoDragDrop. Como primer argumento paso un objeto que estaba vinculado a esa fila. El objeto implementa una interfaz específica y está marcado con un atributo Serializable.

Lo que yo quiero es posible recuperar ese objeto en DragEnter/controlador de eventos DragDrop del control de árbol. Estoy utilizando el siguiente código:

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

Por desgracia, en consecuencia los datos es nula y formatos es una matriz de un solo elemento que contiene el nombre del tipo específico (aplicación de IFoo). Supongo que tendré que pasar el nombre de tipo exacto a GetData para retreve el objeto, pero no es posible ya que es una clase privada.

¿Hay una manera de conseguir el objeto por su interfaz?

Respuesta

4

usted tiene que proporcionar el mismo tipo que la clase que fue serializado en el primer lugar. No puede usar una interfaz o clase base de la clase serializada porque entonces más de uno de los formatos podría coincidir con ella y no sabría cuál deserializar. Si tiene varias clases que implementan IFoo y hay una instancia de cada una dentro del objeto de datos, entonces preguntar por IFoo sería ambiguo. Por lo tanto, debe solicitar el tipo exacto que se serializó en el objeto de datos.

Esto significa que no se debe colocar clases en el objeto de datos que no se puede deserializar porque son privadas en el otro extremo.