うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【C#】登録したすべてのメソッドが true もしくは false を返すか判定する

複数パラメータを監視して、制御したい際に public 変数にしていると管理が大変なので
Func を登録して戻り値で判定できるようにしてみました

クラス

using System;
using System.Collections.Generic;
 
/// <summary>
/// Function を登録して、それが全部満たすか、もしくは満たさないかをチェックする
/// </summary>
public class ValidCheck
{
    private List<Func<bool>> _locker = new List<Func<bool>>();
 
    /// <summary>
    /// ブロックを判定する処理を外部から設定
    /// </summary>
    public event Func<bool> Blockers
    {
        add { if (!_locker.Contains(value)) _locker.Add(value); }
        remove { if (_locker.Contains(value)) _locker.Remove(value); }
    }
  
    public bool Valid
    {
        get
        {
            foreach (var func in _locker)
            {
                var r = func.Invoke();
                if (!r)
                    return false;
            }

            return true;
        }
    }
 
    public bool InValid
    {
        get
        {
            foreach (var func in _locker)
            {
                var r = func.Invoke();
                if (r)
                    return false;
            }
            return true;
        }
    }
}

サンプル

public class Sample
{
    private ValidCheck _check = new ValidCheck();

    private bool _test1;
    private bool _test2;
    private bool _test3;
    public bool Test1() => _test1;
    public bool Test2() => _test2;
    public bool Test3() => _test3;

    private void Main()
    {
        Console.WriteLine($"Valid {_check.Valid}"); // true
        Console.WriteLine($"InValid {_check.InValid}"); // true

        _check.Blockers += Test1;
        _check.Blockers += Test2;
        _check.Blockers += Test3;

        Console.WriteLine($"Valid {_check.Valid}"); // false
        Console.WriteLine($"InValid {_check.InValid}"); // true

        _test1 = true;

        Console.WriteLine($"Valid {_check.Valid}"); // false
        Console.WriteLine($"InValid {_check.InValid}"); // false

        _test1 = _test2 = _test3 = true;

        Console.WriteLine($"Valid {_check.Valid}"); // true
        Console.WriteLine($"InValid {_check.InValid}"); // false

        _test1 = _test2 = _test3 = false;

        Console.WriteLine($"Valid {_check.Valid}"); // false
        Console.WriteLine($"InValid {_check.InValid}"); // true
    }
}