Baku.LibqiDotNet.QiSignatureValidityChecker.CheckValiditySubroutine C# (CSharp) Method

CheckValiditySubroutine() private static method

private static CheckValiditySubroutine ( string methodSignature, string argsSignature ) : bool
methodSignature string
argsSignature string
return bool
        private static bool CheckValiditySubroutine(string methodSignature, string argsSignature)
        {
            //ダイナミック要素の無いシグネチャはこれで素早く評価
            if (methodSignature == argsSignature) return true;

            //シンプルに先頭から調べる
            if (methodSignature == "" && argsSignature != "") return false;
            if (methodSignature != "" && argsSignature == "") return false;


            bool success;
            string msig = GetHeadToken(methodSignature, out success);
            if (!success) return false;

            string asig = GetHeadToken(argsSignature, out success);
            if (!success) return false;

            //引数側がDynamicなので無条件に引数を割り当ててしまってOK
            if (msig == QiSignatures.TypeDynamic)
            {
                return CheckValiditySubroutine(methodSignature.Substring(1), argsSignature.Substring(asig.Length));
            }

            if (msig.Length == 1)
            {
                //組み込み型の場合
                return msig == asig ?
                    CheckValiditySubroutine(methodSignature.Substring(1), argsSignature.Substring(1)) :
                    false;
            }
            else
            {
                //リスト,辞書,タプルの場合, 外側ひっぺがして内側を比較したあとで次に進む
                return (
                    msig[0] == asig[0] &&
                    msig.Last() == asig.Last() && 
                    msig.Length > 1 &&
                    asig.Length > 1 &&
                    CheckValiditySubroutine(msig.Substring(1, msig.Length - 2), asig.Substring(1, asig.Length - 2))
                    ) ?
                    CheckValiditySubroutine(methodSignature.Substring(msig.Length), argsSignature.Substring(asig.Length)) :
                    false;
            }
        }