首页 > 解决方案 > 我可以将 PropertyInfo 序列转换为表达式吗?

问题描述

我正在编写一些验证代码,它使用反射来遍历对象图以查找实现具有特定属性的一些常规静态方法的类型。

我最终得到了访问实现静态方法的类和静态方法本身的 rootobject序列。PropertyInfoMethodInfo

我想编写一个方法来调用静态方法,使用根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此代码应以最佳方式执行,这一点很重要。

标签: c#lambdareflectionlinq-expressions

解决方案


John Skeet 就这个话题写了一篇很棒的文章。

让反射飞起来并探索代表,乔恩·斯基特。 https://codeblog.jonskeet.uk/2008/08/09/making-reflection-fly-and-exploring-delegates/

本质上,您将缓存委托函数,然后调用缓存的委托。由于您仍在使用反射,因此在第一次调用时创建委托会很慢,但在后续调用中,使用缓存的委托会快得多。他的帖子表明缓存的委托比使用 Invoke 快大约 600 倍。


推荐阅读