private string GetMethodSignature(QiAnyValue[] args) { if (Overloads.Count == 1) { return Name + QiSignatures.MethodNameSuffix + Overloads.First().ArgumentSignature; } //オーバーロードがある場合は引数リストと見比べて適合するのがあるか判定 var fittedMethod = Overloads.FirstOrDefault( ol => QiSignatureValidityChecker.CheckValidity(ol.ArgumentSignature, args) ); if (fittedMethod != null) { return Name + QiSignatures.MethodNameSuffix + fittedMethod.ArgumentSignature; } throw new InvalidOperationException( $"Could not find proper overload for {Name}, " + $"args: {QiTuple.Create(args).Signature}, " + $"existing method signatures: {string.Join(",", Overloads.Select(ol => ol.ArgumentSignature).ToArray())}" ); }
/// <summary> /// メソッドの引数リストと実際に渡す予定の引数を比較し、妥当な対応が取れているかを確認します。 /// </summary> /// <param name="signature">ターゲットのシグネチャ(全体を囲うタプルの丸括弧を含む)</param> /// <param name="args">実際の引数のシグネチャ</param> /// <returns></returns> public static bool CheckValidity(string signature, QiAnyValue[] args) => CheckValiditySubroutine( signature.Substring(1, signature.Length - 2), string.Join("", args.Select(a => a.Signature).ToArray()) );