146

C# で基本クラス オブジェクトをその派生クラスの 1 つに明示的に変換することは可能ですか? 現在、基本クラス オブジェクトをパラメーターとして受け取り、プロパティ値をコピーする派生クラスのコンストラクターを作成する必要があると考えています。私はこの考えがあまり好きではないので、できれば避けたいと思っています。

これは機能するようには見えません (オブジェクトは新しいベースとしてインスタンス化されるため、派生クラスの余分なメンバーにメモリを割り当てる必要はありません) が、C# ではそれを実行できるようです:

class BaseClass
{
  ... some stuff ...
}

class DerivedClass : BaseClass
{
    public bool MyDerivedProperty{ get; set; }
}


static void Main(string[] args)
{
    BaseClass myBaseObject = new BaseClass();
    DerivedClass myDerivedObject = myBaseObject as DerivedClass;

    myDerivedObject.MyDerivedProperty = true;
}
4

6 に答える 6

124

いいえ、あなたが言うようにクラスを変換する組み込みの方法はありません。これを行う最も簡単な方法は、あなたが提案したことを行うことです:DerivedClass(BaseClass)コンストラクターを作成します。基本的に、リフレクションなどを使用して、ベースから派生インスタンスへのプロパティのコピーを自動化する他のオプションが出てきます。

を使用して投稿したコードは、ご覧のとおりコンパイルされますが、 のインスタンスではないため、に評価されるasため、実行すると null 参照例外がスローされます。myBaseObject as DerivedClassnullDerivedClass

于 2012-09-24T13:14:01.043 に答える
61

それは可能ではありません。ただし、 AutoMapperのようなオブジェクト マッパーを使用できます

編集

よりシンプルなオブジェクト マッパーを提案したい: TinyMapper。AutoMapper の使用は非常に複雑になりました。もう使いません。TinyMapper はほとんどのユースケースをカバーし、はるかにシンプルで超高速です。

例:

//In app startup
TinyMapper.Bind<Person, PersonDto>();

//Usage
var personDto = TinyMapper.Map<PersonDto>(person);

まだ使用したい人のためのAutoMapper(私が思うに古いバージョン)の例:

class A
{
    public int IntProp { get; set; }
}
class B
{
    public int IntProp { get; set; }
    public string StrProp { get; set; }
}

global.asax またはアプリケーションの起動時:

AutoMapper.Mapper.CreateMap<A, B>();

使用法:

var b = AutoMapper.Mapper.Map<B>(a);

流れるような API を介して構成可能です。

于 2013-01-07T20:39:43.143 に答える
8

自分で変換を実装できますが、お勧めしません。既存のオブジェクトの機能を拡張するためにこれを行いたい場合は、 Decorator パターンを見てください。

于 2012-09-24T13:16:35.020 に答える
1

いいえ、これには組み込みの変換はありません。あなたが言及したように、コンストラクター、または他の変換方法を作成する必要があります。

また、BaseClass は DerivedClass ではないため、myDerivedObject は null になり、上記の最後の行で null ref 例外がスローされます。

于 2012-09-24T13:14:38.457 に答える
0

いいえ、できません。可能な唯一の方法は

static void Main(string[] args)
{
    BaseClass myBaseObject = new DerivedClass();
    DerivedClass myDerivedObject = myBaseObject as DerivedClass;

    myDerivedObject.MyDerivedProperty = true;
}
于 2012-09-24T13:15:23.307 に答える