From a81171184a99a428f010b4ced45ec89308176945 Mon Sep 17 00:00:00 2001 From: varelen <141656781+varelen@users.noreply.github.com> Date: Sat, 16 Aug 2025 21:04:04 +0200 Subject: [PATCH] feat(ComponentMapper): Add 'TryGet' methods (#1006) * feat(ComponentMapper): Add 'TryGet' methods * feat(tests): Add test for new 'TryGet' method in 'ComponentMapper' * refact(ComponentMapper): Simplify logic in 'TryGet' method --- .../MonoGame.Extended/ECS/ComponentMapper.cs | 12 +++++++++ .../ECS/ComponentMapperTests.cs | 25 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/source/MonoGame.Extended/ECS/ComponentMapper.cs b/source/MonoGame.Extended/ECS/ComponentMapper.cs index 10c3c7c6..a4cc870d 100644 --- a/source/MonoGame.Extended/ECS/ComponentMapper.cs +++ b/source/MonoGame.Extended/ECS/ComponentMapper.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics.CodeAnalysis; using MonoGame.Extended.Collections; namespace MonoGame.Extended.ECS @@ -51,6 +52,17 @@ namespace MonoGame.Extended.ECS return Components[entityId]; } + public bool TryGet(Entity entity, [NotNullWhen(true)] out T result) + { + return TryGet(entity.Id, out result); + } + + public bool TryGet(int entityId, [NotNullWhen(true)] out T result) + { + result = Get(entityId); + return result != null; + } + public override bool Has(int entityId) { if (entityId >= Components.Count) diff --git a/tests/MonoGame.Extended.Tests/ECS/ComponentMapperTests.cs b/tests/MonoGame.Extended.Tests/ECS/ComponentMapperTests.cs index 02330d40..be2c5203 100644 --- a/tests/MonoGame.Extended.Tests/ECS/ComponentMapperTests.cs +++ b/tests/MonoGame.Extended.Tests/ECS/ComponentMapperTests.cs @@ -45,6 +45,31 @@ namespace MonoGame.Extended.ECS.Tests Assert.Same(component, mapper.Get(entityId)); } + [Fact] + public void PutAndTryGetComponent() + { + // Arrange + const int entityId = 4; + const int entityIdNotAdded = 100; + + var mapper = new ComponentMapper(1, _ => { }); + var component = new Transform2(); + + mapper.Put(entityId, component); + + // Act + bool foundAdded = mapper.TryGet(entityId, out Transform2 transformFromAdded); + bool foundNotAdded = mapper.TryGet(entityIdNotAdded, out Transform2 transformFromNotAdded); + + // Assert + Assert.Equal(typeof(Transform2), mapper.ComponentType); + Assert.True(mapper.Components.Count >= 1); + Assert.True(foundAdded); + Assert.Same(component, transformFromAdded); + Assert.False(foundNotAdded); + Assert.Equal(default(Transform2), transformFromNotAdded); + } + [Fact] public void OnDelete() {