如何检查类“是”在C#中作为变量给出的类型的实例?

时间:2016-06-26 21:43:39

标签: c# unity3d types superclass

我需要做一些这样的检查:

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项目,所以如果为可比较的项调用另一个GetType()(例如thisInstance.GetType()。GetType()),结果总是System.MonoType,in在哪种情况下,IsInstanceOfType总是返回true,这当然也没用。

为什么比较失败或如何使其发挥作用的任何想法?或者我应该放弃,只需在需要的地方使用“thisInstance is ThatClass”?

3 个答案:

答案 0 :(得分:3)

你可以使用这样的东西。该方法检查泛型对象是否属于数组中的任何类型并返回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;
      }     

答案 1 :(得分:1)

您可以使用isSubclass:

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

答案 2 :(得分:1)

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

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