c# 粘贴列表<MyObj> return null

c# Paste List<MyObj> return null

我正在尝试复制和粘贴列表的一部分。不幸的是,当从剪贴板粘贴时,条件找到了存储的数据,但是当分配给变量时它仍然等于 null。 这是我的列表和列表项代码。

public class ListCanvasBlocks : List<MyBlock>
{
    public List<MyBlock> MyCopySelectedObj()
    {
        var x = new List<MyBlock>();
        x.AddRange(this.Where(z => z.IsSelected));
        return x;
    }
}
[Serializable]
public class MyBlock
{
    public MyBlock(Rectangle rect, BlocksData.Shape shape,int id)
    {
        Rect = rect;
        Shape = shape;
        Text = BlocksData.Text(Shape);
        ID = id;
    }
    public string Text; 
    public bool IsSelected { get; set; } = false;
    public bool IsLocked = false;
    public int ID{ get; set; }
    public Point PointInput;
    public Point PointOutput1, PointOutput2;
    public Rectangle Rect;         
    public SolidBrush BackColor;
    public Color FontColor;
    public int FontSize;
    public BlocksData.Shape Shape{get;set;}
}

这就是我按 ctrl+c/v

时所做的
      public void Copy()
    {
        Clipboard.Clear();
        Clipboard.SetData("ListCanvasBlocks", _canvObj.MyCopySelectedObj());
    }
    public void Paste()
    {
        if (Clipboard.ContainsData("ListCanvasBlocks"))
            {var test = (ListCanvasBlocks)Clipboard.GetData("ListCanvasBlocks");}
    }

Paste 方法中的条件return true 但赋值后变量 test 仍然为 null

i'm trying use this solution

and this and few others

BlockData.Shape 是枚举

您正在尝试剪切和粘贴一个 ListCanvasBlocks,但是 MyCopySelectedObj() 方法 returns 一个 List<MyBlock>,这是一个超类型。运行时无法自动从通用转换为特定。

尝试改变这个:

public class ListCanvasBlocks : List<MyBlock>
{
    public ListCanvasBlocks MyCopySelectedObj()
    {
        var x = new ListCanvasBlocks();
        x.AddRange(this.Where(z => z.IsSelected));
        return x;
    }
}

当我尝试将变量单独添加到剪贴板时,发现问题出在serialization。问题在SolodBrush解决了,因为它attribute is Color,只有没有属性的变量才能序列化。

There 当我发现真正的问题时,我找到了解决方案

看起来像 MyCopySelectedObj() returns MyBlock 的列表,它在 Copy() 上分配给名称 "ListCanvasBlocks",但是当您调用 Paste() 时,您将列表投射到剪贴板到对象 (ListCanvasBlocks)。它继承自List,但仍然不是对象类型ListCanvasBlocks。尝试在调用 Paste() 时直接将 List 转换为该 var 测试。