3

コメントからの更新:

独自のパラメーターで linq-to-sql クラスを拡張する必要があり、生成されたクラスには触れたくありません。より良い提案は大歓迎です。しかし、linq-to-sql クラスが変更された場合、すべての属性の割り当てを何度もやり直したくありません。したがって、vstudio がクラスに新しい属性を生成する場合、私は自分の拡張属性を別々に保持し、クラス自体から新しいインナーライトを作成します。


元の質問:

可能かどうかわかりません。私はクラスカーと、クラスカーから拡張されたクラスマイカーを持っています。クラス 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 クラスが部分的に生成されます。これは、必要な追加のプロパティを追加するために、部分的として宣言された同じクラス名を持つ別のコード ファイルを持つことができることを意味します。

たとえば、Ling-To-Sql デザイナー クラスは次のようになります。

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

Car.cs という独自の別のファイルを (同じプロジェクト内に) 持つことができます。

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

そして、2 つのクラスが 1 つにマージされます。それらが同じ名前空間にあることを確認してください。

于 2010-05-10T11:17:47.867 に答える
2

派生クラスの基本クラスパラメーターを受け入れるコピーコンストラクターを作成できます。

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

がであるという保証がないため、を確実にCarキャストすることはできません。キャストを試して機能するかどうかを確認するか、キーワードを使用してキャストを試して失敗した場合はnullを取得できます。 MyCarCarMyCaras

プロパティはどのように設定されていCarますか?MyCarプロパティを設定するために同じ手法を使用できないのはなぜですか?結局のところ、それはCarです。なぜからを作成したいMyCarCarですか?そもそもを作成してみませんMyCarか?

MyCarを取り、コンストラクター内のプロパティにCarのプロパティを割り当てるコンストラクターを作成することもできます。MyCarCar

サブクラス化の代わりにデコレータパターンを使用することを検討し、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 に答える