Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.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#_Inheritance - Fatal编程技术网

C# 将类转换为派生类

C# 将类转换为派生类,c#,inheritance,C#,Inheritance,有没有办法将基类转换为其派生类 下面是两个类的简单示例: namespace BLL { public class Contact { public int ContactID { get; set; } public string Name { get; set; } public Contact(){} } } namespace BLL { public class SpecialContact : Conta

有没有办法将基类转换为其派生类

下面是两个类的简单示例:

namespace BLL
{
    public class Contact 
    {
       public int ContactID { get; set; }
       public string Name { get; set; }

       public Contact(){}
    }
}

namespace BLL
{
    public class SpecialContact : Contact
    {
       public SpecialContact(){}
    }
}
理想情况下,我可以这样做:

Contact contact = new Contact();
SpecialContact specialContact = new SpecialContact();

contact.ContactID = 123;
contact.Name = "Jeff";

specialContact = contact;
Mapper.CreateMap<Contact, SpecialContact>();
Contact contact = new Contact();
contact.ContactID = 123;
contact.Name = "Jeff";
SpecialContact specialContact = Mapper.Map<Contact, SpecialContact>(contact);
这段代码当然会抛出一个错误。除了为SpecialContact或设置每个属性的方法编写另一个构造函数外,还有其他解决方案吗

这段代码当然会抛出一个错误。除了写另一本书之外 设置每个属性的SpecialContact或方法的构造函数为 还有别的解决办法吗

不,没有别的办法了。如果您希望避免进行所有手动复制,反射可能会对您有所帮助

除了为SpecialContact或设置每个属性的方法编写另一个构造函数外,还有其他解决方案吗

不,不是真的。
你可以通过反射来自动化它,但仅此而已

但请注意,如果设计得当,这几乎是不必要的。它不是(派生)类的正常使用


如果合同可以随着时间的推移变成特殊合同,那么您可以创建一个新对象,或者使用ContactType属性和一些组合对其进行建模

Base
类引用指定给
派生的
类引用变量是非法的

X
类型的变量只能是对
X
类型或派生类型的对象的引用

您可能需要另一个
SpecialContact
实例,该实例包含与现有对象相同的数据。没有办法避免手动复制

当我需要将匹配属性从一个对象复制到另一个不兼容的对象(1)时,我使用以下扩展方法:

然后你可以做:

specialContact.assignFrom(contact);
请考虑一下这个办法。正确的解决方案是在没有遇到这个问题的地方正确地设计类层次结构



1注意:它按名称匹配属性,并假定它们是相同的类型。

如果您只想将属性从一个类实例复制到另一个类实例(无论这些类之间的关系如何),可以使用类似的映射工具

您的具体示例如下所示:

Contact contact = new Contact();
SpecialContact specialContact = new SpecialContact();

contact.ContactID = 123;
contact.Name = "Jeff";

specialContact = contact;
Mapper.CreateMap<Contact, SpecialContact>();
Contact contact = new Contact();
contact.ContactID = 123;
contact.Name = "Jeff";
SpecialContact specialContact = Mapper.Map<Contact, SpecialContact>(contact);
Mapper.CreateMap();
触点=新触点();
contact.ContactID=123;
联系人:Name=“Jeff”;
SpecialContact SpecialContact=Mapper.Map(联系人);

除了重新考虑继承层次结构迫使您执行这种有点不正统的操作之外,您还有几种解决方案,所有这些都需要一些编码

  • 可以向基类添加显式转换运算符
  • 您可以添加一个扩展方法来为您进行复制

就转换继承层次结构而言,您可以使用添加特殊功能到
联系人
类,使其具有
特殊联系人
的功能,而无需子类化。

这没有意义。特殊联系人不是联系人。将联系人转换为特殊联系人意味着什么?@kerrek-域逻辑可能要求将合同更改为特殊合同。但这是不可能(不应该)的东西,如在代码中的类型转换。谢谢大家。为什么不能执行此操作是有道理的。正确,我只是对复制属性感兴趣。AutoMapper看起来是一个很好的解决方案。很好的解决方案,我只是想避免复制属性。