5

タイプのオブジェクトを返すメソッドがありますBucket:

Bucket Dispense(string typeName);

Widgetサブクラスという名前のクラスがありBucketます:

public class Widget : Bucket {  }

私はこれをしたい:

Widget w = Controller.Dispense('widget');

Widgetaが aであることを考えると、これは可能なはずだと思いますBucket。戻り値の型を type にキャストすることもできDispense(string)ますWidgetが、キャストせずにこれを行う方がはるかに望ましいでしょう。Bucket型と型をエイリアスする方法はありWidgetますか?

4

3 に答える 3

3

ジェネリックを使用して、探しているものの一部を取得できます。

public class BucketDispenser
{
    public TBucket Dispense<TBucket>(string typeName) where TBucket : Bucket
    {
        Bucket widget= new Widget();
        // or
        Bucket widget = new OtherWidget();

        return (TBucket)(object)widget;
    }
}

次に、次のように使用できます。

public class MyClass
{
    public MyClass()
    {
        var disp = new BucketDispenser();
        Widget widget = disp.Dispense<Widget>("widget");
        OtherWidget otherWidget = disp.Dispense<OtherWidget>("otherWidget");
    }
 }
于 2012-09-12T04:31:24.997 に答える
2

別の簡単なオプションは、動的を使用してキャストを回避することです。これにより、コンパイル時の型チェックがバイパスされます。

dynamic w = Controller.Dispense('widget');
于 2012-09-12T04:41:54.737 に答える
1

暗黙の変換演算子を使用できます。これは、Bucketクラス内で次のように定義されています。

public static implicit operator Widget(Bucket bucket)
{
    // return the typecast Widget (can also perform any conversion logic here if necessary)
    return (Widget)bucket;
}

これで、いわば「暗黙的に」キャストを実行できます。

Bucket b = new Bucket();
Widget w = b;

pst のコメント、および MSDN リンクから注意して使用することに注意してください

変換演算子は、明示的または暗黙的に指定できます。暗黙的な変換演算子は簡単に使用できますが、演算子のユーザーに変換が行われていることを認識させたい場合は、明示的な演算子が役立ちます。

于 2012-09-12T04:07:28.433 に答える