如果我有这个:
public class bClass
{
int id {get; set;}
string name {get; set;}
}
public class dClass : bClass
{
int extraVal {get; set;}
}
我有一个bClass对象列表:
List<bClass> baseClassList = getBaseClassList();
将“extralVal”设置为指定值,将baseClassList转换为dClass对象列表的最简单方法是什么?我希望找到类似的解决方案:
public class dClass : bClass
{
public dClass(bClass b, int exVal)
{
base = b;
extraVal = exVal;
}
int extraVal {get; set;}
}
List<dClass> dClassList = bClassList.ConvertAll(x => new dClass(x, exVal));
它基本上只是插入基础然后设置额外的属性值,但显然这不是正确的语法。这样做的正确方法是什么?
答案 0 :(得分:1)
不确定具体情况,但预测可能会有所帮助吗?
bClassList.Select(i=>new dClass{ id=i.id, name=i.name, extraval=exVal});
或者你可以使用反射
public dClass(bClass c)
{
// copy base class properties.
foreach (PropertyInfo prop in c.GetType().GetProperties())
{
PropertyInfo prop2 = c.GetType().GetProperty(prop.Name);
prop2.SetValue(this,prop.GetValue(c, null), null);
}
}
答案 1 :(得分:1)
您无法基于基类型的对象创建派生类型的新对象。
我认为你得到的最接近的是基类的copy constructor。
public class bClass {
public bClass(bClass source) {
// TODO: Null check
id = source.id;
name = source.name;
}
public int id {get; set;}
public string name {get; set;}
}
public class dClass : bClass {
public dClass(bClass source, int extraVal): base(source) {
// TODO: Null check
extraVal = extraVal;
}
public int extraVal {get; set;}
}
List<bClass> baseClassList = getBaseClassList();
List<dClass> dClassList = bClassList.ConvertAll(x => new dClass(x, exVal));
答案 2 :(得分:0)
没有内置方法将基础对象转换为派生对象。这也是不好的做法。您当前的解决方案最适合这种情况。
ConvertAll
是正确的功能。这是来自MSDN。
Converts an array of one type to an array of another type.
正如@PLB所提到的,你应该研究Decorator Pattern
。
答案 3 :(得分:0)
您仍然需要将所有字段复制到基类的构造函数。您可以放置constuctor,它接受基类中的bClass,然后在子类中调用它。
bClass
{
....
public bClass(bClass b)
{
...
}
}
public class dClass : bClass
{
public dClass(bClass b, int exVal):base(b)
{
extraVal = exVal;
}
....
}
并找到了关于如何使用反射在c#中编写复制构造函数的链接 http://johnsadventures.com/2006/07/03/an_intelligent_copy_constructor_in_c_usi/
答案 4 :(得分:0)
构造函数可以使用base关键字来调用基类的构造函数。以下是一个例子:
public class Manager : Employee
{
public Manager(int annualSalary)
: base(annualSalary)
{
//Add further instructions here.
}
}
(Source)