我知道它之前在ExpandoObjects here上被要求反思。
我的问题有点不同。我有静态和动态函数,它们应该从一些类似于object ExecuteFunction(string name, params object[] parameters)的函数中执行。
我通过反射执行静态函数。所以问题是,如果我可以重用MethodInfo调用并从ExpandoObject获取一个MethodInfo对象?或者我必须实现两个函数(一个使用Action,另一个使用MethodInfo)?
发布于 2012-08-21 20:28:09
对于ExpandoObject上动态定义的方法,您将不会获得任何MethodInfo。
动态定义的方法和动态定义的属性是一样的,它们只是碰巧是委托类型。
但是,此委托类型包含名为MethodInfo类型的名为Method的属性,您可以使用该属性:
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的其他特性,所以这个参数就是我们需要其功能的已实现接口的类型。
发布于 2012-08-21 22:23:22
开源框架ImpromptuInterface (可从nuget获得)提供了对DLR调用的简单访问,这些调用允许您通过字符串名称调用方法。唯一的问题是,如果方法返回InvokeMember,则必须使用InvokeMemberAction,如果它返回值,则可以使用void。这允许您调用动态定义的方法,并且调用静态定义的方法比反射更快。
https://stackoverflow.com/questions/12054614
复制相似问题