C# 动态类型和条件
本文关键字:条件 类型 动态 | 更新日期: 2023-09-27 18:30:40
我已经开始使用 C# 4.0 并喜欢动态关键字。但是,我不确定我正在做的事情是否可以被视为良好做法。请参阅下面的代码:
static void Main()
{
NoobSauceObject noob = new NoobsauceObject();
dynamic theReturnType = noob.do(param);
if (theReturnType.GetType().ToString().Contains("TypeOne"))
theReturnType.ExecuteMethodOfTypeOne();
else if (theReturnType.GetType().ToString().Contains("TypeTwo"))
theReturnType.ExecuteMethodOfTypeTwo();
else
throw new ArgumentException("");
}
有没有更好的方法?我发现上述方法非常简单,并且一直在使用它,但不确定从长远来看它是否是我应该坚持的东西。
编辑:如果我使用.NET 3.5或更低版本或没有动态关键字做同样的事情,那么什么是好的实现?
提前感谢!! :)
在我看来
,您只是在两个不相关的类型之间进行类型测试。如果可能的话,我会在这里看看多态性,或者至少:实现一个通用接口。但是,以下内容也可以:
var typeOne = theReturnType as TypeOne;
if(typeOne != null) typeOne.ExecuteMethodOfTypeOne();
else {
var typeTwo = theReturnType as TypeTwo;
if(typeTwo != null) typeTwo.ExecuteMethodOfTypeTwo();
else throw new ArgumentException("somethingMeaningful");
}
但是,我的首选选项是:
var typed = theReturnType as ISomeInterface;
if(typed != null) typed.SomeMethod();
else throw new ArgumentException("somethingMeaningful");
其中TypeOne
和TypeTwo
可能会使用显式接口实现在其 API 上公开该方法:
public class TypeOne : ISomeInterface {
void ISomeInterface.SomeMethod() { ExecuteMethodOfTypeOne(); }
public void ExecuteMethodOfTypeOne() {
// ...
}
}
(同样TypeTwo
)
我看不出dynamic
在这里没有真正的用处;对于返回类型的noob.do(param)
,在第一个例子中object
会很好 - 或者ISomeInterface
会更好。