我需要做一些这样的检查:
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”?
答案 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());