如何检查对象是否为C#中的任何给定类型

时间:2019-06-23 23:27:26

标签: c# .net code-cleanup

我正在使用Unity Engine,其中有一个基类Component和派生自其中的多个类,包括TransformMeshRenderer和我创建的许多类。

我想执行一个动作(在这种情况下,Destroy不是所有类型的组件:TransformMeshRendererMeshFilter,{{1} }和Collider)。我的基本方法如下:

BuildMenuItem

我认为它看起来很丑,我发现缩短它的唯一方法是使用Component[] components = obj.GetComponents<Component>(); foreach (var component in components) { if (component is MeshFilter) continue; if (component is MeshRenderer) continue; if (component is Transform) continue; if (component is Collider) continue; if (component is BuildMenuItem) continue; Destroy(component); } 运算符,但是它并不能解决很多问题,而且IMO看起来更糟。有没有更清洁的实现方式?

2 个答案:

答案 0 :(得分:3)

您可以初始化Type个集合(例如List<Type>HashSet<Tepe>等),向其中添加所有必需的类型(typeof(Transform),...) ,然后使用Contains检查组件类型是否在该集合中。

var types = new HashSet<Type> {typeof(Transform), typeof(MeshRenderer)};

Component[] components = obj.GetComponents<Component>();
foreach (var component in components.Where(c => !types.Contains(c.GetType())))
{
    Destroy(component);
}

已更新:

Type[] types = { typeof(Transform), typeof(MeshRenderer) };

Component[] components = obj.GetComponents<Component>();
foreach (var component in components.Where(c => !types.Any(x => c.GetType().IsAssignableFrom(x))))
{
    Destroy(component);
}

答案 1 :(得分:0)

创建接口INotDestroyable,使不可破坏类型TransformMeshRendererMeshFilterColliderBuildMenuItem实现它,然后在循环上,只需检查元素是否未实现即可。界面不必定义任何属性或成员。