最終更新日 2024-09-25

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

概要

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

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

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

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

namespace NET5COMServer
{
    [ComVisible(true)]
    [Guid("C144B4C1-27CB-401F-ABE8-55378564E18D")]
    public class NET5COMServer
    {
        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;
        }
    }
}

呼び出し側

「comhost」と付いた.dllが呼び出し対象だということを忘れないようにしましょう。

NET5COMServer.mac
#obj = createobject( currentmacrodirectory + @"\NET5COMServer.comhost.dll", "{C144B4C1-27CB-401F-ABE8-55378564E18D}");

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

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

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