使用params的IronPython调用方法:使用反射动态调用正确的方法

时间:2014-03-16 17:17:55

标签: c# reflection ironpython params

我使用C#作为我的主机lang,我的代理是IronPython,我正在实际地在我的范围内设置方法。所以,我的问题是我通过反思调用正确方法的代理方法。参数为string methodNameparams object[] args,方法的代码内容为:

initalScope.Add(obj.Name.ToLower(), new Func<object[], dynamic>( param 
                    => ReflectionMethodProxy( obj.Name ,  param ) ));

这是我最初的设置。我的问题是,当我尝试在ironpython中传递一个参数时,我得到错误expected Array[object], got str这是可以理解的,但是,它应该采用1个参数,因为该方法的参数调用params

所以我把方法调用改为了这个

initalScope.Add(obj.Name.ToLower(), new Func<object, dynamic>( param 
                    => ReflectionMethodProxy( obj.Name , param.GetType() != typeof (Array) ? new [] { param } : param ) ));

适用于一个参数,但显然不适用于多个参数。 我的目标是能够通过Ironpython传递多个参数,然后将其分发到c#中的正确方法。以下是我的代码。我可能错过了一些明显的东西,但我已经有一段时间了,真的需要更多的眼睛。

以下测试代码的结果是两个错误 methodcall("test1") - 提供了预期的 Array[object] got str错误 methodcall("test1",3) - 提供 Invoke() takes exactly 1 argument (2 given)

// dummy method for format sake
public void setScope()
{
    foreach (var obj in LinkedDocument.GetType().GetMethods().Where(
             method => method.GetCustomAttributes(typeof(ScriptingVoidAttribute), true).Length != 0 
             || method.GetCustomAttributes(typeof(ScriptingFuncAttribute), true).Length != 0))

            initalScope.Add(obj.Name.ToLower(), new Func<object[], dynamic>( param 
                => ReflectionMethodProxy( obj.Name , param ) ));
}

public dynamic ReflectionMethodProxy( string methodName , params object[] args )
{
     return LinkedDocument.GetType().GetMethod(methodName, args.Select(obj 
                => obj.GetType()).ToArray())
            .Invoke(LinkedDocument, args);
}

提前感谢您的帮助。

0 个答案:

没有答案