C#在不同类型的对象之间进行转换

时间:2016-04-23 11:58:04

标签: c# .net types casting

首先,我是C#的新手 我得到的错误是:

  

附加信息:无法转换类型' UserGUI.MyItems'输入' CommonBookLib.AbstractItem'。

他们是两个不同的类:

public class MyItems
{
    public string ItemName { get; set; }
    public int CopyNumber { get; set; }
    public int Guid { get; set; }
    public DateTime? TimePrinted { get; set; }
    public string Category { get; set; }
    public string SubCategory { get; set; }
    public bool? BestSeller { get; set; }
}

public class AbstractItem : IPropsDetails
{
    public int CopyNumber { get; }
    public string ItemName { get; }
    public DateTime Time { get; }
    public int Guid { get; }

    public AbstractItem(int copyNumber, string itemName, DateTime time, int guid)
    {
        this.CopyNumber = copyNumber;
        this.ItemName = itemName;
        this.Time = time;
        this.Guid = guid;
    }
}

当我这样做时会发生:

AbstractItem myItemsList = (AbstractItem)LibraryList.SelectedItem;
logicManager.Remove(myItemsList);

嗯,正如您所看到的,我有MyItems负责我的GUI中的 DataBindings AbstractItem,它负责对我的数据执行添加操作保存了。

由于我没有很好地管理我的代码,我遇到了这种情况,我真的不想更改MyItems(删除并重新编码AbstractItem)。 我该如何转换这两个?

顺便说一下,我知道AbstractItem只有4个属性而MyItems有更多属性。

但是,我的孩子具有与AbstractItem完全相同的属性。

任何帮助将不胜感激。提前谢谢!

3 个答案:

答案 0 :(得分:5)

MyItems类中移除AbstractItem类中同样存在的字段,然后从MyItems派生{。}}。

您必须向MyItems添加一个构造函数,将所需的值传递给基础构造函数,或者向基类添加一个空构造函数。

public class MyItems : AbstractItem
{
    public MyItems(int copyNumber, string itemName, DateTime time, int guid)
        :base(copyNumber, itemName, time, guid)
    {
    }

    public DateTime? TimePrinted { get; set; }
    public string Category { get; set; }
    public string SubCategory { get; set; }
    public bool? BestSeller { get; set; }
}

答案 1 :(得分:0)

您可以MyItems继承AbstractItem,或者创建一个处理它们之间转换的方法。

答案 2 :(得分:0)

你似乎需要一个映射器而不是一个强制转换器。查看AutoMapper或按照habibhassani的建议编写自己的例程。此外,格兰特的答案非常好。 但是你的问题是关于施法,所以在这里我展示了如何实现一个施法操作符,以便你的演员可以工作。这不是一种你应该轻易达到的技术。它直接在AbstractItem中依赖于MyItems,并且它不是代码维护者最容易被发现的模式。

public class MyItems
{
    public string ItemName { get; set; }
    public int CopyNumber { get; set; }
    public int Guid { get; set; }
    public DateTime? TimePrinted { get; set; }
    public string Category { get; set; }
    public string SubCategory { get; set; }
    public bool? BestSeller { get; set; }

    public static explicit operator AbstractItem(MyItems myitems)
    {
        return new AbstractItem(myitems.CopyNumber, myitems.ItemName, myitems.TimePrinted, myitems.Guid);
    }
}

更多的纪念活动。命名你的类AbstractItem令人困惑,这意味着它实际上是抽象的,但事实并非如此。

Guid是一个糟糕的名称,因为它已经是一个类型。您的名为Guid的内容为int - 令人困惑。