c# - 将类转换为派生类

标签 c# inheritance

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

这是两个类的简单示例:

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;

这段代码当然会抛出一个错误。除了为 SpecialContact 或设置每个属性的方法编写另一个构造函数外,还有其他解决方案吗?

最佳答案

Base 类引用分配给 Derived 类引用变量是非法的。

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

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

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

public static void AssignFrom(this object destination, object source) {
  Type dest_type = destination.GetType();
  Type source_type = source.GetType();

  var matching_props = from d in dest_type.GetProperties()
                        join s in source_type.GetProperties()
                        on d.Name equals s.Name
                        where d.IsWritable() && s.IsReadable()
                        select new {
                          source = s,
                          destination = d
                        };

  foreach (var prop in matching_props) {
    prop.destination.SetValue(destination, prop.source.GetValue(source, null), null);
  }
}

然后你可以这样做:

specialContact.assignFrom(contact);

请考虑这是一种解决方法。正确的解决方案是在您不会遇到此问题的地方正确设计您的类层次结构。


1 注意:它按名称匹配属性并假定它们属于同一类型。

关于c# - 将类转换为派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9253292/

相关文章:

c# - 我的 C# 类中的相对路径如何与 NUnit 3.x 一起使用?

javascript - 回发后 Jquery Fancybox 不工作

c# - 如何创建自定义工具以在 Visual Studio 2010 中生成代码?

java - Java内部类的层次结构

javascript - 覆盖 JavaScript 中比较运算符的默认行为

javascript - 参数未通过两级 JavaScript 构造函数传递

c# - 多个结果集与多个性能调用

c# - 如何更改 ListView 中 TextBlock 中选定的文本颜色?

c++ - 模板类 : accessing derived normal-class methods

C++ 继承 : How to get Size of called object?