2013-12-04 3 views
1

Когда я пытаюсь сделать следующее, результаты являются неожиданными. Любые идеи будут высоко оценены!Использование подкласса DataObject в качестве буфера обмена DataObject

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 нет ничего

Выход Write утверждения: "System.Windows.Forms.DataObject". Разве это не «DataObjectSub»? Мне что-то не хватает?

Edited по запросу:

В случае Drag/операций Drop, что 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 не являются ничего. Типы обоих извлеченных объектов - DataObjectSub.

Спасибо за любые идеи и терпение! :)

ответ

1

Это не неожиданное поведение. Clipboard.GetDataObject просто хранит данные в Clipboard (как указано MSDN), и его тип - DataObject (как указано в вашем коде). Когда вы проверяете его тип, не имеет значения, является ли входная переменная DataObject или любым другим типом (поддерживается GetDataObject). Имейте в виду, что GetDataObject - это метод, возвращаемое значение которого не обязательно должно соответствовать правилам назначения по умолчанию (т. Е. Его вызов не вызывает те же эффекты, что и назначение переменной 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.

UPDATE

После нашего обсуждения, я хочу уточнить, что 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 в то же время), отношения 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 переменных DataObject (или, точнее: System.Windows.Forms.DataObject).

+0

Спасибо за ваш ответ! Моя путаница такова: MSDN (ссылка, которую вы предоставили) утверждает, что возвращаемый объект GetDataObject является iDataObject (а не DataObject). Если вы пытаетесь: Dim myObject как DataObject = Clipboard.GetDataObject получает ошибку Implicit Conversion, так как iDataObject не может быть неявно преобразован в DataObject. Если MS хотел, чтобы возвращаемое значение GetDataObject было DataObject, почему метод возвращает iDataObject? (Parenthetically iDataObject, используемый в операции DragDrop, принимает подклассовый DataObject (например, DataObjectSub) и отлично работает с ним). – cak

+0

@cak Пожалуйста, взгляните на мой обновленный ответ. – varocarbas

Смежные вопросы