unity游戏引擎-如何检查类是否“是”c#中以变量形式给出的类型的实例

本文关键字:变量 实例 类型 何检查 引擎 游戏 是否 检查 unity | 更新日期: 2023-09-27 17:51:19

我需要做一些检查,像这样:

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)

仍然总是返回false。

以防万一,这是一个Unity项目,所以如果为可比项目调用一个进一步的GetType()(例如:thisInstance.GetType(). gettype())的结果总是System。MonoType,在这种情况下,IsInstanceOfType总是返回true,这当然也没有用。

你知道为什么比较失败或者如何使它工作吗?或者我应该放弃并在需要的地方简单地使用"thisInstance is ThatClass"?

unity游戏引擎-如何检查类是否“是”c#中以变量形式给出的类型的实例

您可以这样使用。该方法检查泛型对象是否属于数组中的任何类型,并返回bool值。

    public static bool IsOfAnyType<T>(T obj, Type[] types)
    {
        bool isOfAnyType = false;
        for (int i = 0; i < classes.Length; i++)
        {
            if (types[i].IsAssignableFrom (obj.GetType()))
            {
                isOfAnyType = true;
                break;
            }
        }
         return isOfAnyType;
      }     

你可以使用isSubclass:

thisInstance.GetType().IsSubclassOf(typeof(ThatClass))

要获得您想要的工作方式,您可以使用以下方法:

public static bool IsOfAnyType(object obj, Type[] types)
{
    return types.Any(type => type.IsInstanceOfType(obj));
}

如果你不能使用Linq,你可以这样写方法:

public static bool IsOfAnyType(object obj, Type[] types)
{
    foreach (var type in types)
    {
        if (type.IsInstanceOfType(obj))
            return true;
    }
    return false;
}
为了测试这一点,我使用以下代码:
Type[] typesToCheck = { typeof(ThatClass), typeof(ThatOtherClass) };
ThatClass input1 = new ThatClass();
ThatOtherClass input2 = new ThatOtherClass();
if (IsOfAnyType(input1, typesToCheck))
    Console.WriteLine("Hello world from " + input1.GetType());
if (IsOfAnyType(input2, typesToCheck))
    Console.WriteLine("Hello world from " + input2.GetType());