MRが楽しい

MRやVRについて学習したことを書き残す

HoloLens2でホロモンアプリを作る その123(拡張メソッドを使ってアイテムの状態を判定するロジックを追加する)

本日はアプリ作成枠です。
HoloLens2でホロモンアプリを作る進捗を書き留めていきます。
今回は拡張メソッドを使ってアイテムの状態を判定するロジックを追加しました。

拡張メソッド

拡張メソッドを使用すると、元の型の変更を行うことなく既存の型にメソッドを追加できます。
拡張メソッドは静的メソッドですが、拡張された型のインスタンスメソッドのように呼び出すことができます。
learn.microsoft.com

・拡張メソッドの作成例

    public class FullName
    {
        // フルネーム
        public readonly string Value;
        private FullName(string fullName) => Value = fullName;
        
        // フルネーム生成用メソッド
        public static FullName CreateFullName
            (string familyName, string lastName)
            => new FullName($"{familyName} {lastName}");
    }

    public static class FullNameExtension
    {
        // 苗字(FamilyName)取り出しの拡張メソッド
        public static string GetFamilyName(this FullName fullName)
            => fullName.Value.Split(" ")[0];

        // 名前(LastName)取り出しの拡張メソッド
        public static string GetLastName(this FullName fullName)
            => fullName.Value.Split(" ")[1];
    }

今回はホロモンアプリ内でアイテムの状態を定義している enum 型に、その状態を判定するメソッドをの拡張メソッドとして追加しました。
拡張メソッドを用いることで状態の定義とそれに対する判定ロジックの実装を切り分けることができます。

実装コード

以下のように実装を行いました。
それぞれアイテムの状態を定義する enum 型とその状態が掴まれている状態に含まれるかを判定する拡張メソッドです。
・ArtifactStatusType.cs

    /// <summary>
    /// アーティファクト状態の種別
    /// </summary>
    public enum ArtifactStatusType
    {
        /// <summary>
        /// デフォルト
        /// </summary>
        Nothing = 0,
        /// <summary>
        /// 床上
        /// </summary>
        Item_Floor = 1,
        /// <summary>
        /// 空中
        /// </summary>
        Item_Air = 2,
        /// <summary>
        /// ホールド状態(ホロモン)
        /// </summary>
        Item_HoloMonHold = 3,
        /// <summary>
        /// ホールド状態(プレイヤー)
        /// </summary>
        Item_PlayerHold = 4,
    }

・ArtifactStatusTypeExtension.cs

    public static class ArtifactStatusTypeExtension
    {
        // 指定の状態が掴まれている状態に含まれるか
        public static bool IsHold(this ArtifactStatusType artifactStatusType)
        {
            return artifactStatusType switch
            {
                ArtifactStatusType.Nothing => false,
                ArtifactStatusType.Item_Air => false,
                ArtifactStatusType.Item_Floor => false,
                ArtifactStatusType.Item_PlayerHold => true,
                ArtifactStatusType.Item_HoloMonHold => true,
                _ => throw new ArgumentOutOfRangeException(nameof(artifactStatusType), artifactStatusType, null)
            };
        }
    }

拡張メソッドを定義すると、以下のように対象の型のインスタンスから直接呼び出すことができます。
・ArtifactStatusTest.cs

    public class ArtifactStatusTest
    {
        private ArtifactStatusType _artifactStatusType;

        public ArtifactStatusTest(ArtifactStatusType artifactStatusType)
        {
            _artifactStatusType = artifactStatusType;
        }

        // アイテムが捕まれ状態か否か
        public bool IsHold => _artifactStatusType.IsHold();
    }