如何在不必每次生成代码时进行更改的情况下扩展LINQ-to-SQL类?

时间:2010-05-10 10:43:10

标签: c# .net-3.5 casting partial-classes


评论更新:

我需要通过自己的参数扩展linq-to-sql类,并且不想触及任何生成的类。欢迎任何更好的建议。但是如果linq-to-sql类正在改变,我也不想再次进行所有属性赋值。因此,如果vstudio为类生成新属性,我将自己的扩展属性保持独立,并且新的内部来自类本身


原始问题:

我不确定是否可能。 我有一辆级轿车和一辆mycar从班级车延伸出来。 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 个答案:

答案 0 :(得分:17)

在回答您对该问题的评论时,Linq-To-Sql类将生成为partial。这意味着您可以使用声明为partial的相同类名的单独代码文件来添加所需的额外属性。

E.g。你的Ling-To-Sql设计器类将是:

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

你可以拥有一个名为Car.cs的独立文件(在同一个项目中):

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

这两个类将合并在一起。只需确保它们位于相同的命名空间中。

答案 1 :(得分:2)

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

class MyCar {
    public MyCar(Car car) {
        name = car.name;
        // etc
    }
}

答案 2 :(得分:1)

您无法肯定地将Car转换为MyCar,因为无法保证CarMyCar。您可以尝试强制转换并查看它是否有效,或者您可以使用as关键字来尝试强制转换,如果失败则获取null。

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

您还可以在MyCar中创建一个构造函数,该构造函数需要Car并将MyCar的属性分配给构造函数中Car的属性。

您也可以考虑使用decorator pattern作为子类化的替代方法,并让MyCar委托对包装Car的调用

答案 3 :(得分:0)

您可以使用以下几个选项:

  • implicit or explicit运营商
    public static explicit operator Car(MyCar source)

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

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