3

从评论更新:

我需要通过自己的参数扩展 linq-to-sql 类,并且不想触及任何生成的类。欢迎任何更好的建议。但是,如果 linq-to-sql 类正在更改,我也不想再次进行所有属性分配。因此,如果 vstudio 为类生成新属性,我将自己的扩展属性分开,并且新属性从类本身继承


原始问题:

我不确定这是否可能。我有一辆 class car 和 class mycar 从 class car 扩展而来。mycar 类也有一个字符串列表。只有区别。

我现在如何在不手动分配所有属性的情况下将任何汽车对象转换为 mycar 对象。像:

Car car = new Car();

MyCar mcar = (MyCar) car;

或者

MyCar mcar = new MyCar(car);

或者但是我可以用自己的变量扩展汽车,而不必总是这样做

Car car = new Car();
MyCar mcar = new MyCar();
mcar.name = car.name;
mcar.xyz = car.xyz;
...

谢谢。

4

4 回答 4

17

为了回应您对该问题的评论,Linq-To-Sql 类作为部分生成。这意味着您可以将具有相同类名的单独代码文件声明为 partial 以添加您想要的额外属性。

例如,您的 Ling-To-Sql 设计器类将是:

public partial class Car
{
     .... lots of auto generated stuff ....
}

您可以拥有自己的名为 Car.cs 的单独文件(在同一个项目中):

public partial class Car
{
     public MyCustomStuff{ get; set; }
}

这两个类将合并在一起。只要确保它们在同一个命名空间中。

于 2010-05-10T11:17:47.867 回答
2

您可以在派生类中创建一个接受基类参数的复制构造函数:

class MyCar {
    public MyCar(Car car) {
        name = car.name;
        // etc
    }
}
于 2010-05-10T10:53:23.353 回答
1

您不能确定将 a Caras强制转换为,MyCar因为不能保证Cara 是 a MyCar。您可以尝试强制转换,看看它是否有效,或者您可以使用as关键字尝试强制转换,如果失败则返回 null。

属性是如何设置的Car?为什么不能MyCar只使用相同的技术来设置其属性?毕竟它是一个Car. 为什么MyCar要从 a创建一个Car?为什么不MyCar首先创建一个?

您还可以创建一个构造函数,MyCar其中接受 aCar并将属性分配给构造函数中的MyCar属性Car

您也可以考虑使用装饰器模式作为子类化的替代方案,并让您的MyCar委托对包装的调用Car

于 2010-05-10T10:52:17.433 回答
0

您可以使用几个选项:

  • 隐式或显式运算符
    public static explicit operator Car(MyCar source)

  • 复制构造函数
    public MyCar(Car source)

  • 扩展方法
    public static class CarExtensions {
    public static MyCar Create(this Car source) }

于 2010-05-10T11:42:32.550 回答