从方法返回到子类的Cast对象

时间:2012-09-12 04:03:31

标签: c# methods return-value subclass

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

Bucket Dispense(string typeName);

我有一个名为Widget的类,其子类为Bucket

public class Widget : Bucket {  }

我想这样做:

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

我认为应该是可能的,因为WidgetBucket。我可以将Dispense(string)的返回类型转换为Widget类型,但我更倾向于在没有强制转换的情况下执行此操作。有没有一种方法可以对BucketWidget类型进行别名处理?

3 个答案:

答案 0 :(得分: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");
    }
 }

答案 1 :(得分:2)

另一个简单的选择是你可以使用dynamic来避免强制转换,它会绕过编译时类型检查:

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

答案 2 :(得分:1)

您可以使用implicit conversion operator。这在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链接谨慎使用:

  

转换运算符可以是显式的也可以是隐式的。隐式转换运算符更易于使用,但当您希望运算符的用户意识到正在进行转换时,显式运算符非常有用。