我有两个控件一个表单:列表和树(特定类型名称无关)。
在列表控件中,我执行DoDragDrop方法。作为第一个参数,我传递一个对象,该对象是绑定到该行的数据。该对象实现了一个特定的接口,并标有Serializable属性。
我想要的是在树控件的DragEnter / DragDrop事件处理程序中检索该对象。我正在使用以下代码:
void TreeControlDragEnter(object sender, DragEventArgs e)
{
var formats = e.Data.GetFormats();
var data = e.Data.GetData(typeof (IFoo));
}
不幸的是,结果数据为null,格式是一个单元素数组,它保存特定类型的名称(实现IFoo)。我假设我必须将确切的类型名称传递给GetData来撤销对象,但它不可能,因为它是一个私有类。
有没有办法通过界面获取对象?
答案 0 :(得分:3)
您必须提供与首先序列化的类相同的类型。您不能使用序列化类的接口或基类,因为不止一种格式可能匹配它,并且它不知道要反序列化哪一种。如果你有几个类都实现IFoo并且数据对象中有每个实例,那么要求IFoo将是不明确的。因此,您必须询问序列化到数据对象中的确切类型。
这意味着您不应该将类放入无法反序列化的数据对象中,因为它们在另一端是私有的。