5

我有一个返回类型对象的方法Bucket

Bucket Dispense(string typeName);

我有一个名为Widgetsubclasses的类Bucket

public class Widget : Bucket {  }

我想做这个:

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

鉴于 aWidget是 a ,我认为这应该是可能的Bucket。我可以将返回类型Dispense(string)转换为 type Widget,但我更愿意在没有转换的情况下这样做。有没有一种别名BucketWidget类型的方法?

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 回答