当我尝试以下操作时,结果出乎意料。任何想法都将非常感激!
Class DataObjectSub
Inherits DataObject
End Class
Sub Test()
Dim myObject = New DataObjectSub
myObject.SetData("Test")
Clipboard.SetDataObject(myObject)
Dim myRetrievedObject As IDataObject = Clipboard.GetDataObject
Console.Write(myRetrievedObject.GetType.ToString)
Dim myRetrievedObject2=TryCast(Clipboard.GetDataObject,DataObjectSub)
End Sub
myRetrievedObject2是Nothing
Write语句的输出是:“System.Windows.Forms.DataObject”。不应该是“DataObjectSub”吗?我错过了一些明显的东西吗?
按要求编辑:
在拖放操作的情况下,再次使用DataObject(实现iDataObject),可以这样做:
Sub TestDragDrop
Dim myObject as iDataObject=new DataObjectSub
someControl.DoDragDrop(myObject, myAllowedEffects)
End Sub
稍后......在DragOver事件处理程序中:
Sub anotherControl_DragOver(sender as object, e as DragEventArgs)
Dim myRetrievedObject1 as DataObjectSub = TryCast(e.Data, DataObjectSub)
Dim myRetrievedObject2 as IDataObject = e.Data
End Sub
效果很好,myRetrievedObject1和myRetrievedObject2都不是Nothing。两个检索对象的类型都是DataObjectSub。
感谢您的任何想法和耐心! :)
答案 0 :(得分:1)
这不是意料之外的行为。 Clipboard.GetDataObject
只会将数据存储在Clipboard
(由MSDN引用)中,其类型为DataObject
(由您的代码引用)。检查其类型时,输入变量是DataObject
还是任何其他类型(GetDataObject
支持)无关紧要。请记住GetDataObject
是一种方法,其返回值不需要遵循默认的赋值规则(即,调用它不会产生与向{{1}分配String
变量相同的效果。例如,变量。)。
此代码:
Object
输出与您的代码完全相同的结果。 Dim myString As String = "Test"
Clipboard.SetDataObject(myString)
Dim myRetrievedObject As IDataObject = Clipboard.GetDataObject
Console.Write(myRetrievedObject.GetType.ToString)
只检查myRetrievedObject.GetType.ToString
的类型,始终为GetDataObject
。
更新
在我们讨论之后,我想澄清DataObject
返回Clipboard.GetDataObject
变量(IDataObject
的接口,而不是其他类型)。示例代码以了解所有这些:
DataObject
正如您所看到的(满足两个条件,意味着所有变量同时属于Dim myRetrievedObject1 As IDataObject = Clipboard.GetDataObject
Dim myRetrievedObject2 As DataObject = New DataObject(Clipboard.GetDataObject)
Dim myRetrievedObject3 As DataObject = DirectCast(Clipboard.GetDataObject, DataObject)
Dim test4 As DataObject = New DataObject
If (TypeOf myRetrievedObject1 Is DataObject AndAlso TypeOf myRetrievedObject2 Is DataObject AndAlso TypeOf myRetrievedObject3 Is DataObject AndAlso TypeOf test4 Is DataObject) Then
'Condition is met
End If
If (TypeOf myRetrievedObject1 Is IDataObject AndAlso TypeOf myRetrievedObject2 Is IDataObject AndAlso TypeOf myRetrievedObject3 Is IDataObject AndAlso TypeOf test4 Is IDataObject) Then
'Condition is met
End If
和DataObject
类型),关系IDataObject
/ {{ 1}}不像两种不同类型之间的那种。实际上,如DataObject
所示,转换只是一个正式的要求(我正在向IDataObject
投射myRetrievedObject3
变量!)。 DataObject
/ DataObject
基本上是同一枚硬币的两面(称为DataObject
)。这意味着以下条件为真:
IDataObject
也就是说,DataObject
和Dim Type1 As String = myRetrievedObject1.GetType().ToString()
Dim Type2 As String = myRetrievedObject2.GetType().ToString()
Dim Type3 As String = myRetrievedObject3.GetType().ToString()
Dim Type4 As String = test4.GetType().ToString()
If (Type1 = Type2 AndAlso Type1 = Type3 AndAlso Type1 = Type4 AndAlso Type1 = GetType(DataObject).ToString) Then
'Condition is met
End If
变量的类型名称为DataObject
(或更确切地说:IDataObject
)。