有没有办法将基类转换为派生类?
这是两个类的简单示例:
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/