Буфер обмена Копирование объектов в и из

Я пытаюсь скопировать объект в буфер обмена Windows и снова выключить. Мой код выглядит следующим образом:

Скопировать в буфер обмена:

Clipboard.Clear();
DataObject newObject = new DataObject(prompts);
newObject.SetData(myString);
Clipboard.SetDataObject(newObject);

Где prompts - это коллекция List<Data.Sources.PromptResult>.

Скопировать буфер обмена:

IDataObject dataObject = System.Windows.Forms.Clipboard.GetDataObject();
if (dataObject.GetDataPresent(typeof(List<Data.Sources.PromptResult>)))
{
  Type type = typeof(List<Data.Sources.PromptResult>);
  Object obj = dataObject.GetData(type);
  return (List<Data.Sources.PromptResult>)dataObject.GetData(type);
}

GetFormats() показывает формат как находящийся в списке, а GetDataPresent(List<Data.Sources.PromptResult>) возвращает true, но если я попытаюсь получить объект из класса Clipboard с GetData(List<Data.Sources.PromptResult>), я получаю возврат null.

Кто-нибудь может понять, что может быть неправильным?

Ответ 1

OK Я попытался добавить список своего типа пользователя в буфер обмена и вернуть его обратно... Вот что я пробовал:

Мой пользовательский класс:

public class User
{
   public int Age { get; set; }
   public string Name { get; set; }
}

Остальная часть кода:

// Create User list and add some users
List<User> users = new List<User>();
users.Add(new User { age = 15, name = "Peter" });
users.Add(new User { age = 14, name = "John" });

// Lets say its my data format
string format = "MyUserList";
Clipboard.Clear();

// Set data to clipboard
Clipboard.SetData(format, users);

// Get data from clipboard
List<User> result = null;
if (Clipboard.ContainsData(format))
    result = (List<User>)Clipboard.GetData(format);

... и результат был null:) ... пока я не обозначил класс User как Serializable

[Serializable]
public class User
{ 
    //...   
}

После этого мой код работал. Хорошо, это не ответ, но, возможно, это поможет вам каким-то образом.

Ответ 2

@Reniuz благодарит за вашу помощь, это помогло мне выработать ответ.

Чтобы получить текст и данные пользовательских объектов из буфера обмена с несколькими форматами, я реализовал интерфейс IDataObject в своем классе. Код для установки объекта данных должен иметь флаг копирования, установленный следующим образом:

Clipboard.Clear();
Clipboard.SetDataObject(myClassThatImplementsIDataObject, true);

Чтобы получить данные снова, стандартный текст можно получить, используя:

Clipboard.GetText();

Данные могут быть получены с использованием метода данных:

Clipboard.GetData("name of my class");

Другой момент, который был полезен, заключался в том, чтобы проверить, что объект, который я помещал в буфер обмена, можно было сериализовать, используя класс BinaryFormatter для выполнения этого теста... Если возникает исключение, что копирование в буфер обмена также потерпит неудачу, но тихо.

Итак, у моего класса есть:

[Serializable]
public class ClipboardPromptsHolder : IDataObject
{
    ...
}

Ответ 3

У меня был похожий сценарий, и после маркировки моего класса как сериализуемого я получил его для работы.

Итак, попробуйте поместить атрибут Serializable в свой класс Data.Sources.PromptResult.

Ответ 4

Я обнаружил, что если ваш класс является производным от другого класса, необходимо также сделать базовый класс [Serializable], иначе этот рецепт не будет работать. В моем случае это было что-то вроде

public abstract class MyAbstractUser
{
...
}

[Serializable]
public class MyUser : MyAbstractUser
{
...
}

Когда я пытался обмениваться значениями MyUser через буфер обмена, он не работал, но когда я добавил [Serializable] в MyAbstractUser, он работал.