首先,我是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
完全相同的属性。
任何帮助将不胜感激。提前谢谢!
答案 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
- 令人困惑。