我有一个简单的继承层次结构,MyType2
继承自 MyType1
。
我有一个 MyType1
的实例,arg
,作为参数传入一个方法。如果 arg
是 MyType2
的实例,那么我想执行一些逻辑,转换实例。我的代码类似于下面的代码。
必须创建一个新的局部变量 b
感觉很不优雅 - 有没有一种方法可以在不使用额外的局部变量的情况下实现相同的行为?
public MyType1 MyMethod(MyType1 arg)
{
if(arg is MyType2)
{
MyType2 b = arg as MyType2;
//use b (which modifies "arg" as "b" is a reference to it)...
}
return arg;
}
最佳答案
请注意,“is”和“as”是重复测试; 或者使用is
然后(一旦你知道)就施放 - 或者首先使用as
然后测试对于 null
。
关于您的问题;如果你只想做一件事 - 然后投:
if(arg is MyType2)
{
((MyType2)arg).SomeSpecialMethod();
}
否则 - 也许是一个虚拟
方法(在基本类型上),或者只是将逻辑重构到另一个方法中,所以你有:
if(arg is MyType2)
{
StuffThatTakesType2((MyType2)arg);
}
但是个人,我只是使用额外的变量:
MyType2 whatever = arg as MyType2;
if(whatever != null) {
whatever.Foo = 123;
whatever.Bar();
}
关于c# - 如何在 C# 中将实例变量视为另一种类型的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2472079/