【发布时间】:2016-10-28 20:21:50
【问题描述】:
我需要做一些这样的检查:
if(thisInstance is ThatClass || thisInstance is ThatOtherClass)
实际上我不需要做很多这些,所以我可以像上面那样简单地写它,但我仍然更喜欢以更整洁的方式来做这件事,例如。像这样:
Type[] arrayOfClasses = new Type[] { typeof(ThatClass), typeof(ThatOtherClass))}
if(isOfAnyType(thisInstance, arrayOfClasses))
但由于某种原因,我无法让它工作。出于某种原因,即使
的字符串表示thisInstance.GetType()
和
typeof(ThatClass)
会是一样的,
thisInstance.GetType().IsInstanceOfType(type)
仍将始终导致错误。
如果有所不同,这是一个 Unity 项目,因此如果为可比较的项目(例如 thisInstance.GetType().GetType())调用另一个 GetType(),结果始终是 System.MonoType,在在这种情况下 IsInstanceOfType 总是返回 true,这当然也没有用。
任何想法为什么比较失败或如何使其工作?还是我应该放弃并在需要的地方简单地使用“thisInstance is ThatClass”?
【问题讨论】:
-
我不会认为您的原始代码以任何方式“不整洁”。这似乎很简单。当您可以使用语言的运算符时,为什么要使用反射?更好的问题是“我可以重组我的代码,以便不需要“是”检查吗?”
-
好吧,只有这两个类,它并不是特别不整洁,但它不太容易配置,而且如果有更多的类,我认为它会显得有点不整洁。
-
当然,但是问题是:为什么你有一个程序,你必须对事物的类型进行大量运行时检查?与其试图掩盖运行时检查产生的任何不雅代码,不如尝试完全消除它们。
-
我的原因是我想要一个方法来选择是否根据调用它的类的类型(+一些附加条件)来做某事。
-
干脆不要那样做。将被调用者的行为基于调用者的类型是一种非常糟糕的编程实践。寻找另一种方法来解决您的问题。听起来您可能有一个dispatch 问题:您希望在外星人向人类发射子弹时发生一件事,而在人类向机器人发射激光时发生另一件事,也许吧?这个问题有经过充分研究的解决方案。说出你真正的问题是什么,让我们来解决它。
标签: c# unity3d types superclass