C# 拖放自定义对象

C# 拖放自定义对象,c#,winforms,drag-and-drop,C#,Winforms,Drag And Drop,我有两个控件,一个是表单:列表和一个树(特定的类型名称是不相关的) 在列表控件中,我执行DoDragDrop方法。作为第一个参数,我传递了一个数据绑定到该行的对象。对象实现了一个特定的接口,并用Serializable属性标记 我想要的是在树控件的DragEnter/DragDrop事件处理程序中检索该对象。我正在使用以下代码: void TreeControlDragEnter(object sender, DragEventArgs e) { var formats = e.Data

我有两个控件,一个是表单:列表和一个树(特定的类型名称是不相关的)

在列表控件中,我执行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将是不明确的。因此,您必须询问序列化到数据对象中的确切类型

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