我正在编写一些验证代码,该代码使用反射来遍历对象图以查找实现具有某些属性的某些常规静态方法的类型。
最后我得到根object
,序列PropertyInfo
来访问实现静态方法的类和静态方法本身的MethodInfo
。
我想使用根object
作为参数编写一种方法来调用静态方法。我当前的实现看起来像这样。
private static ValidateOptionsResult InvokeValidation<TConfig>(
TConfig root,
IImmutableStack<PropertyInfo> path,
MethodInfo target)
{
object node = root;
foreach (var accessorInfo in path)
{
node = accessorInfo.GetMethod.Invoke(
node,
new object[]
{
});
}
return (ValidateOptionsResult)target.Invoke(
null,
new object[]
{
node
});
}
我还没有测试过,但是我认为它可以解释我的意思。
问题是,是否有更好的方法通过构建Expression
而不是链接调用来实现?更好的是,我的意思是实际调用时性能更快。
此方法将用于注册IValidateOptions<TOptions>
,并且每次注入TOptions
时都会调用此验证。此代码应以最佳性能运行很重要。
答案 0 :(得分:2)
约翰·斯基特(John Skeet)在这个话题上写得很好。
进行反思飞行和探索代表,乔恩·斯凯特(Jon Skeet)。 https://codeblog.jonskeet.uk/2008/08/09/making-reflection-fly-and-exploring-delegates/
基本上,您将缓存委托函数,然后调用缓存的委托。在第一个调用中,由于您仍在使用反射,因此创建代理的速度会很慢,但是在后续调用中,使用缓存的代理会更快。他的帖子表明,缓存的委托比使用Invoke快600倍。