我有一个返回Bucket
类型的对象的方法:
Bucket Dispense(string typeName);
我有一个名为Widget
的类,其子类为Bucket
:
public class Widget : Bucket { }
我想这样做:
Widget w = Controller.Dispense('widget');
我认为应该是可能的,因为Widget
是Bucket
。我可以将Dispense(string)
的返回类型转换为Widget
类型,但我更倾向于在没有强制转换的情况下执行此操作。有没有一种方法可以对Bucket
和Widget
类型进行别名处理?
答案 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链接谨慎使用:
转换运算符可以是显式的也可以是隐式的。隐式转换运算符更易于使用,但当您希望运算符的用户意识到正在进行转换时,显式运算符非常有用。