1

クラスの構造例は次のとおりです。

public class Base
{
}

public class Child1 : Base
{
}

public class Child2 : Base
{
}

そして、私はいくつかの黒魔術をしたい:

Base @base = new Child2(); //note: there @base is declared as Base while actual type is `Child2`
var child1 = (Child1) @base;

そしてSystem.InvalidCastException、期待どおりに失敗します。

次に、暗黙のキャスト演算子をに追加しましたChild2

public class Child2 : Base
{
    public static implicit operator Child1(Child2 child2)
    {
        return new Child1();
    }
}

そして、コードは依然として同じ例外をスローします (明示的な演算子も役に立ちません)。

カスタムキャストメソッドを使用したり、ローカル変数を としてdynamic宣言したりせずに、この動作を修正する方法はありますか?@baseChild2

4

1 に答える 1

2

Child2 に暗黙のキャストを実装しましたが、実際には Base からキャストしようとしています。

Child1 への暗黙的な変換が適用されるように、最初に Child2 にキャストする必要があります。

var child1 = (Child1)(Child2)base;

また

Child1 child1 = (Child2)base;

タイプがわからない場合は、次のようにします。

var child1 = base is Child1 ? (Child1)base : (Child1)(Child2)base;
var child2 = base is Child2 ? (Child2)base : (Child2)(Child1)base;

まったく異なるアプローチは次のようになります。

public class Base
{
    public T As<T>() where T : Base, new()
    {
        return this as T ?? new T();
    }
}

しかしとにかく - これは悪い設計であり、一般的に、そのようなものを持つべきではありません.

実際の必要性、やろうとしていること、すべての詳細を投稿し、より良い設計/解決策を求めることをお勧めします.

于 2012-05-16T11:33:58.283 に答える