Как проверить, является ли объект какого-либо из указанных типов в C # - PullRequest
0 голосов
/ 24 июня 2019

Я работаю с Unity Engine, где есть базовый класс Component и несколько производных классов, в том числе Transform, MeshRenderer и многие созданные мной классы.

Я хочу выполнитьдействие (в данном случае Destroy все компоненты, не относящиеся к типам: Transform, MeshRenderer, MeshFilter, 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 ]

3 голосов
/ 24 июня 2019

Вы можете инициализировать коллекцию 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);
}
0 голосов
/ 24 июня 2019

Создание интерфейса INotDestroyable, создание неразрушимых типов Transform, MeshRenderer, MeshFilter, Collider и BuildMenuItem для его реализации, а затем в цикле просто проверьте, не реализуется ли элемент Это. Интерфейсу не нужно определять какие-либо свойства или элементы.

...