我知道之前在ExpandoObjects here上被要求反思。
我的问题有点不同。我有静态和动态函数,应该从类似object ExecuteFunction(string name, params object[] parameters)
的函数执行。
我通过Reflection执行静态函数。所以问题是,如果我可以重用MethodInfo调用并从ExpandoObject获取MethodInfo对象?或者我是否必须实现2个功能(一个使用Action
,另一个使用MethodInfo
)?
答案 0 :(得分:3)
对于ExpandoObject上的动态定义方法,您不会获得任何MethodInfo
动态定义的方法与动态定义的属性相同,它们恰好是委托类型。
但是,此委托类型包含一个名为Method
的属性MethodInfo
,您可以使用该属性:
object ExecuteFunction(IDictionary<string, object> obj, string name,
params object[] parameters)
{
object property;
if(!obj.TryGetValue(name, out property))
return null;
var del = property as Delegate;
if(del == null)
return null;
var methodInfo = del.Method;
// do with methodInfo what you need to do to invoke it.
// This should be in its own method so you can call it from both versions of your
// ExecuteFunction method.
}
请注意,第一个参数的类型为IDictionary<string, object>
。 ExpandoObject
实现了这个接口,我们不需要ExpandoObject
的其他功能,所以参数只是我们需要的功能所实现的接口的类型。
答案 1 :(得分:1)
开源框架ImpromptuInterface(可从nuget获得)提供对DLR调用的轻松访问,使您可以通过字符串名称调用方法。唯一的问题是,如果方法返回void,则必须使用InvokeMemberAction,如果返回值,则可以使用InvokeMember。这允许您调用动态定义的方法,并且比反射更快地调用静态定义的方法。