当方法信息仅在运行时已知时,优化MethodInfo.Invoke

时间:2014-01-04 21:14:13

标签: c# performance reflection invoke

我使用反射来调用方法,并且使用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水平并在那里做一些技巧吗?

1 个答案:

答案 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));