Here's a way without indirection:
Class MyPackage.MyClass
{
ClassMethod MyMethod(p1 = 1, p2 = 2, p3 = 3)
{
Write p1,"-",p2,"-",p3,!
}
/// do ##class(MyPackage.MyClass).Test()
ClassMethod Test()
{
Do ..FromJson({})
Do ..FromJson({"p1":"first value", "p2":"second value"})
Do ..FromJson({"p1":"first value", "p3":"third value"})
Do ..FromJson({"p2":"second value"})
}
/// do ##class(MyPackage.MyClass).ArgPosMapping("MyPackage.MyClass", "MyMethod")
ClassMethod ArgPosMapping(class, method, Output map)
{
kill map
set formalspec = $$$comMemberKeyGet(class,$$$cCLASSmethod,method,$$$cMETHformalspecparsed)
for i=1:1:$ll(formalspec) {
set arg = $lg(formalspec, i)
set map($lg(arg, 1)) = i
}
set map = $ll(formalspec)
}
ClassMethod FromJson(json)
{
Do ..ArgPosMapping($classname(), "MyMethod", .map)
Set iterator = json.%GetIterator()
Set position = 0
While iterator.%GetNext(.key, .value) {
Set position = position + 1
Set arguments(map(key)) = value
}
Set arguments = map
Do ..MyMethod(arguments...)
}
}- Log in to post comments
