c# - 我可以将 PropertyInfo 序列转换为表达式吗?
问题描述
我正在编写一些验证代码,它使用反射来遍历对象图以查找实现具有特定属性的一些常规静态方法的类型。
我最终得到了访问实现静态方法的类和静态方法本身的 rootobject
序列。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
此代码应以最佳方式执行,这一点很重要。
解决方案
John Skeet 就这个话题写了一篇很棒的文章。
让反射飞起来并探索代表,乔恩·斯基特。 https://codeblog.jonskeet.uk/2008/08/09/making-reflection-fly-and-exploring-delegates/
本质上,您将缓存委托函数,然后调用缓存的委托。由于您仍在使用反射,因此在第一次调用时创建委托会很慢,但在后续调用中,使用缓存的委托会快得多。他的帖子表明缓存的委托比使用 Invoke 快大约 600 倍。
推荐阅读
- android - 如何在移动设备上调整网站的ui
- javascript - 赛普拉斯:如何将一个元素拖向另一个动态元素
- python - Python3检查int epochtime是否小于X小时差异
- c - 如何在 C 中分析算法的运行时间?
- javascript - 如果刻度在图表内,如何在 d3js 中的轴刻度标签后面添加 svg 矩形作为背景
- django - 如何检查日期在模型范围之间
- swift - 快速异步/等待 for 循环
- java - Spring HATEOS:考虑在你的配置中定义一个 'org.springframework.hateoas.config.HypermediaRestTemplateConfigurer' 类型的 bean
- html - html 锚点跳转到屏幕底部或顶部,具体取决于您所在的位置
- php - 获取 Facebook 数字 ID WebDriver PHP