我使用C#作为我的主机lang,我的代理是IronPython,我正在实际地在我的范围内设置方法。所以,我的问题是我通过反思调用正确方法的代理方法。参数为string methodName
和params 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);
}
提前感谢您的帮助。