2

如果我有这个:

public class bClass
{
    int id {get; set;}
    string name {get; set;}
}

public class dClass : bClass
{
    int extraVal {get; set;}
}

我有一个 bClass 对象列表:

List<bClass> baseClassList = getBaseClassList();

将baseClassList转换为将“extralVal”设置为指定值的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));

它本质上只是插入基础然后设置额外的属性值,但显然这不是正确的语法。这样做的正确方法是什么?

4

5 回答 5

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); 
 }  
}
于 2013-06-25T06:38:04.260 回答
1

您不能基于基类型的对象创建派生类型的新对象。

我认为您将获得的最接近的是基类上的复制构造函数。

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));
于 2013-06-25T06:39:58.460 回答
0

没有将基础对象转换为派生对象的内置方法。这也是不好的做法。您当前的解决方案最适合这种情况。

ConvertAll是正确的功能。这是来自 MSDN。

Converts an array of one type to an array of another type.

正如@PLB 提到的,您应该查看Decorator Pattern.

于 2013-06-25T06:34:03.247 回答
0

您仍然需要将所有字段复制到基类的构造函数。您可以将接受 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/

于 2013-06-25T06:45:12.017 回答
0

构造函数可以使用 base 关键字来调用基类的构造函数。下面是一个例子:

public class Manager : Employee
{
    public Manager(int annualSalary)
        : base(annualSalary)
    {
        //Add further instructions here.
    }
}

来源

于 2013-12-18T17:17:38.387 回答