最終更新日 2024-09-25

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

概要

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

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

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

NET5COMServer.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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
1
2
3
4
5
6
7
8
9
#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内の関数が呼ばれるので意味がある