最終更新日 2024-09-25

引数や返り値の型を問わない関数

概要

数値でも文字列でもどちらでも対応できる関数も、いとも簡単に実現できます。

「数値」or「文字列」の引数、「数値」or「文字列」の返り値、どちらでも機能する関数の定義方法

返り値と引数をobject型にし、実際の型を判定すればよいだけです。
決してobject型そのもののオブジェクトを返すわけではありません。
int型なりstring型なりの値を返すわけですが、どちらの型でもいけるよう、親クラス型となるobject型で宣言しておくことになります。

NET4COMServer.cs
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace NET4COMServer
{
    [Guid("BD55F2A6-9ED0-4F4F-9D37-E6B84BE63272")]
    public class NET4COMServer
    {
        public object add(object a, object b)
        {
            if (a is int && b is int)
            {
                return int_add((int)a, (int)b);
            } else
            {
                return str_add(a.ToString(), b.ToString());
            }
        }
        public string str_add(string a, string b)
        {
            return a + b;
        }

        public int int_add(int a, int b)
        {
            return a + b;
        }
    }
}

呼び出し側

NET4COMServer.mac
#obj = createobject( currentmacrodirectory + @"\NET4COMServer.dll", "NET4COMServer.NET4COMServer");

$str_add = member(#obj, "add", "あいう", "かきく");
message($str_add);

#int_add = member(#obj, "add", 100, 200);
message(str(#int_add));

releaseobject(#obj); // dllは解放されないが、dll内の関数が呼ばれるので意味がある