C#不同类型对象之间的转换
首先,我是C#的新手。C#不同类型对象之间的转换,c#,.net,types,casting,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 DateTi
我得到的错误是: 其他信息:无法将“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; }
}
及
当我这样做时就会发生:
AbstractItem myItemsList = (AbstractItem)LibraryList.SelectedItem;
logicManager.Remove(myItemsList);
正如您所看到的,我有MyItems
,它们负责GUI中的数据绑定,还有AbstractItem
,它们负责对保存数据的位置执行添加操作
由于我没有很好地管理代码,我陷入了这种情况,我真的不想更改MyItems
(删除并重新编码AbstractItem
)。
我怎样才能将两者转换
顺便说一下,我知道AbstractItem
只有4个属性,而MyItems
有更多属性
但是,我的子项具有与AbstractItem
完全相同的属性
任何帮助都将不胜感激。提前谢谢 从
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; }
}
从
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; }
}
您可以使
MyItems
继承AbstractItem
,或使一个方法处理它们之间的转换。您可以使MyItems
继承AbstractItem
,或使一个方法处理它们之间的转换。您似乎需要一个映射程序而不是一个强制转换。查看AutoMapper或按照habibhassani的建议编写自己的例程。格兰特的回答也很好。
但是你的问题是关于铸造的,所以我在这里展示如何实现铸造操作符,以便铸造能够正常工作。这不是一个你应该轻易达到的技巧。它直接在MyItems
中依赖于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 static explicit operator AbstractItem(MyItems myitems)
{
return new AbstractItem(myitems.CopyNumber, myitems.ItemName, myitems.TimePrinted, myitems.Guid);
}
}
还有几项仪式。将类命名为AbstractItem
令人困惑,这意味着它实际上是抽象的,但实际上不是
Guid
对于属性来说是一个糟糕的名称,因为它已经是一个类型。您有一个名为Guid
的东西,它是一个int
——令人困惑。您似乎更需要一个映射器而不是一个cast。查看AutoMapper或按照habibhassani的建议编写自己的例程。格兰特的回答也很好。
但是你的问题是关于铸造的,所以我在这里展示如何实现铸造操作符,以便铸造能够正常工作。这不是一个你应该轻易达到的技巧。它直接在MyItems
中依赖于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 static explicit operator AbstractItem(MyItems myitems)
{
return new AbstractItem(myitems.CopyNumber, myitems.ItemName, myitems.TimePrinted, myitems.Guid);
}
}
还有几项仪式。将类命名为AbstractItem
令人困惑,这意味着它实际上是抽象的,但实际上不是
Guid
对于属性来说是一个糟糕的名称,因为它已经是一个类型。您有一个名为Guid
的东西,它是一个int
-令人困惑的东西