gpt4 book ai didi

C# 动态类型和条件

转载 作者:行者123 更新时间:2023-12-02 17:30:39 26 4
gpt4 key购买 nike

我已经开始使用 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 或更低版本执行相同操作,或者不使用动态关键字,那么什么是一个好的实现?

提前致谢!! :)

最佳答案

在我看来,您只是在两个不相关的类型之间进行类型测试。如果可能的话,我会在这里考虑多态性,或者至少:实现一个通用接口(interface)。不过,以下内容也可以:

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");

其中 TypeOneTypeTwo 可能使用显式接口(interface)实现来公开其 API 上的方法:

public class TypeOne : ISomeInterface {
void ISomeInterface.SomeMethod() { ExecuteMethodOfTypeOne(); }
public void ExecuteMethodOfTypeOne() {
// ...
}
}

(同样TypeTwo)

我认为这里的dynamic没有真正的用处;对于 noob.do(param) 的返回类型,第一个示例中的 object 就可以了,或者 ISomeInterface 会更好。

关于C# 动态类型和条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10069537/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com