我有从MonoBehaviour
public abstract class AbstractMyGameBeh : MonoBehaviour{//....}
还有很多其他类,实现了这个基类。
public class MyGameBeh: AbstractMyGameBeh {//....}
public class BMyGameBeh: AbstractMyGameBeh {//....}
public class CMyGameBeh: AbstractMyGameBeh {//....}
所以现在我需要找到这个类的所有游戏对象。
Ofcource,我可以这样做,但如果我从AbstractMyGameBeh
派生更多的类,我将不得不再次修复这个代码部分。
GameObject.FindObjectsOfType<AMyGameBeh>()
GameObject.FindObjectsOfType<BMyGameBeh>()
GameObject.FindObjectsOfType<CMyGameBeh>()
答案 0 :(得分:1)
C#6.0允许使用
if(objOfTypeMyGameBeh.GetType() == typeof(AbstractMyGameBeh))
{
//It's the type you want
}
else
{
//it's not the type you want
}
或as
if(objOfTypeMyGameBeh as AbstractMyGameBeh != null)
{
//It's the type you want, works aswell with inheritance
}
else
{
//it's not the type you want
}
这应该可行,你可以很容易地把它放在循环中来检查每个对象。
正如评论中所指出的,如果你没有存储你可以使用的值是关键字
答案 1 :(得分:0)
我最近遇到了类似问题,此解决方案可能适用于您的问题:
public static IEnumerable<Type> GetTypes()
{
var sourceAssembly = Assembly.GetCallingAssembly();
var assemblies = new List<Assembly>();
assemblies.AddRange(sourceAssembly.GetReferencedAssemblies().Select(an => Assembly.Load(an)));
assemblies.Add(sourceAssembly);
var subclassTypes = new HashSet<Type>();
foreach (var assembly in assemblies)
{
var types = assembly.GetTypes().Where(t => t.IsSubclassOf(typeof(AbstractMyGameBeh)));
foreach (var type in types) subclassTypes.Add(type);
}
return subclassTypes;
}
即使您的AbstractMyGameBeh
位于不同的程序集中,只要您从所有子类都可用的程序集中调用它,这应该可以正常工作。
它将搜索所有程序集(调用它们及其引用的所有程序集),用于抽象类的继承类。
现在,这将为您提供一组类型。所以你仍然需要使用反射来调用GameObject.FindObjectsOfType<T>()
。应该是这样的......
foreach(var subclassType in subclassTypes)
{
MethodInfo method = GetType("GameObject").GetMethod("FindObjectsOfType")
.MakeGenericMethod(new Type[] { subclassType });
method.Invoke(gameObject, new object[] { });
}