您好我想在C#
中将Parent对象强制转换为Child对象public class Parent
{
public string FirstName {get; set;}
public string LastName {get; set;}
public string City {get; set;}
}
public class Child : Parent
{
public string PhoneNumber {get; set;}
public string MobileNumber {get; set;}
}
现在的情况是父对象列表,我想生成子对象列表,以便我可以有扩展信息
List<Parent> lstParent;
List<Child> lstChild = new List<Child>();
foreach(var obj in lstParent)
{
lstChild.add((Child)obj);
}
作为子类继承父类,所以子类已经有父类成员我只想自动填充它们,以便我可以填充子类的数据库
答案 0 :(得分:23)
我这样做(这只是一个例子):
using System.Reflection;
public class DefaultObject
{
...
}
public class ExtendedObject : DefaultObject
{
....
public DefaultObject Parent { get; set; }
public ExtendedObject() {}
public ExtendedObject(DefaultObject parent)
{
Parent = parent;
foreach (PropertyInfo prop in parent.GetType().GetProperties())
GetType().GetProperty(prop.Name).SetValue(this, prop.GetValue(parent, null), null);
}
}
使用:
DefaultObject default = new DefaultObject { /* propery initialization */ };
ExtendedObject extended = new ExtendedObject(default); // now all properties of extended are initialized by values of default properties.
MessageBox.Show(extended.Parent.ToString()); // now you can get reference to parent object
答案 1 :(得分:19)
如果我理解你的“我只是想自动填充它们”正确评论,你想要创建一个新的Child对象,其中填充了Parent的值,并使用新属性的默认值。最好的方法是创建一个复制值的构造函数:
public class Parent
{
public string FirstName {get; set;}
public string LastName {get; set;}
public string City {get; set;}
}
public class Child : Parent
{
public string PhoneNumber {get; set;}
public string MobileNumber {get; set;}
public Child (Parent parentToCopy)
{
this.FirstName = parentToCopy.FirstName;
this.LastName = parentToCopy.LastName;
this.City = parentToCopy.City;
this.PhoneNumber = string.Empty; // Or any other default.
this.MobileNumber = string.Empty;
}
}
现在你可以像上面的答案一样使用LINQ来创建每个Parent的Child:
List<Child> lstChild = lstParent.Select(parent => new Child(parent)).ToList();
请注意,这与@daryal的答案非常相似,但是将父对象复制逻辑包装在构造函数中,而不是将其置于new Child()
调用之外。
答案 2 :(得分:6)
我确实喜欢这个:
class Parent
{
...
}
class Child :Parent
{
...
public Child(Parent p)
{
foreach (FieldInfo prop in p.GetType().GetFields())
GetType().GetField(prop.Name).SetValue(this, prop.GetValue( p));
foreach (PropertyInfo prop in p.GetType().GetProperties())
GetType().GetProperty(prop.Name).SetValue(this, prop.GetValue( p, null), null);
}
}
答案 3 :(得分:4)
这是我提出的解决方案。
public static void ShallowConvert<T, U>(this T parent, U child)
{
foreach (PropertyInfo property in parent.GetType().GetProperties())
{
if (property.CanWrite)
{
property.SetValue(child, property.GetValue(parent, null), null);
}
}
}
答案 4 :(得分:2)
你也可以使用反射,但这对你的情况来说更简单。
foreach(var obj in lstParent)
{
Child child = new Child(){ FirstName = obj.FirstName, LastName=obj.LastName, City = obj.City};
child.MobileNumber = "some mobile number";
child.PhoneNumber = "some phone number";
lstChild.Add((Child)obj);
}
答案 5 :(得分:1)
var lstChild = lstParent.Cast<Child>().ToList();
或
var lstChild = lstParent.ConvertAll(x=>(Child)x);
但是,这两个假设Parent
列表实际上包含Child
个实例。您无法更改对象的实际类型。
答案 6 :(得分:0)
解决此问题的另一种方法是让Parent
控制复制逻辑,而Child
会将复制源传递到base
构造函数中。
例如迭代Avner的解决方案
public class Parent
{
public string FirstName {get; set;}
public string LastName {get; set;}
public string City {get; set;}
public Parent()
{
}
public Parent(Parent copyFrom)
{
this.FirstName = copyFrom.FirstName;
this.LastName = copyFrom.LastName;
this.City = copyFrom.City;
}
}
public class Child : Parent
{
public string PhoneNumber {get; set;}
public string MobileNumber {get; set;}
public Child (Parent parentToCopy) : base(parentToCopy)
{
}
}
答案 7 :(得分:-1)
Downcast是一个术语,用于描述将父类的对象强制转换为子类..
这不是最好的方法,但是如果您需要快速解决方案,可以尝试将父对象转换为&#39; object&#39;先键入,然后将对象强制转换为子类型。
Parent p = new Parent();
Child c = (Child)((object) p);