拖放自定义对象

本文关键字:对象 自定义 拖放 | 更新日期: 2023-09-27 18:00:56

我有两个控件——一个是表单:list和一个树(具体的类型名称无关紧要(。

在列表控件中,我执行DoDragDrop方法。作为第一个参数,我传递了一个对象,该对象是绑定到该行的数据。该对象实现了一个特定的接口,并标记有Serializable属性。

我想要的是在树控件的DragEnter/DragDrop事件处理程序中检索该对象。我使用以下代码:

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

不幸的是,结果数据为null,formats是一个包含特定类型名称的单元素数组(实现IFoo(。我假设我必须将确切的类型名称传递给GetData才能检索对象,但这是不可能的,因为它是一个私有类。

有没有办法通过对象的接口获取对象?

拖放自定义对象

您必须提供与最初序列化的类相同的类型。不能使用序列化类的接口或基类,因为这样可能会有多个格式与之匹配,而且它不知道要反序列化哪一个。如果有几个类都实现了IFoo,并且数据对象中每个类都有一个实例,那么请求IFoo将是不明确的。因此,您必须询问序列化到数据对象中的确切类型。

这意味着您不应该将类放入无法反序列化的数据对象中,因为它们在另一端是私有的。