Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#不同类型对象之间的转换_C#_.net_Types_Casting - Fatal编程技术网

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

首先,我是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; }
}

当我这样做时就会发生:

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
-令人困惑的东西