我使用反射来调用方法,并且使用Invoke()调用方法不会对我这么做,太慢了。我生成了数千万个方法调用,它是一个测试自动化工具。在编译时,我不知道方法名称,参数类型或返回类型。因此Jon Skeet关于using delegates to cache reflection的文章在这里没有帮助。 这就是我所拥有的:
foreach (MethodInfo method in _methods)
{
foreach (var p in method.GetParameters())
{
var paramValue = Utils.RandomizeParamValue(p.ParameterType.Name);
parameters.Add(paramValue);
}
var result = method.Invoke(_objectInstance, parameters.ToArray());
//_objectInstance is the class instance of which the method is a member of.
}
我研究过DLR(ExpandoObject,DynamicObject),但我不确定它有什么我想要的。我正在寻找的是一种绕过反射或缓存方法调用的开销的方法,即使它被证明是一个丑陋的黑客。我错过了一个常见的黑客攻击吗?我可以进入IL水平并在那里做一些技巧吗?
答案 0 :(得分:1)
一种选择是使用表达式树来构建将调用您的方法的委托。 MSDN在Expression Trees文章中有介绍,特别是您需要MethodCallExpression
创建表达式样本(来自MethodCallExpression
文章):
string[,] gradeArray =
{ {"chemistry", "history", "mathematics"}, {"78", "61", "82"} };
var arrayExpression = Expression.Constant(gradeArray);
// Create a MethodCallExpression that represents indexing
// into the two-dimensional array 'gradeArray' at (0, 2).
// Executing the expression would return "mathematics".
var methodCallExpression = Expression.ArrayIndex(
arrayExpression,
Expression.Constant(0),
Expression.Constant(2));
Compile
表示委托样本(来自主文章):
Expression<Func<int, bool>> expr = num => num < 5;
Func<int, bool> result = expr.Compile();
Console.WriteLine(result(4));