从嵌套对象中获取属性值 - 高效的方式而不是反射

时间:2017-09-11 21:45:16

标签: c# algorithm c#-4.0 reflection

我的用例可以包含数千个类的实例。该类中的一个属性也与类的属性相同,这可以继续。

所以我基本上有一组嵌套类。现在,如果我要搜索一个房产的价值,我的选择是什么。

我发现recursionion为一个(Getting Nested Object Property Value Using Reflection)并且将GetNestedTypes(https://msdn.microsoft.com/en-us/library/493t6h7t(v=vs.110).aspx)详尽地用作其他。

我读到反射是昂贵的,所以我的问题是,有没有其他方法来搜索属性而不使用反射概念?

1 个答案:

答案 0 :(得分:1)

您可以使用表达式树来创建抽象语法树,然后可以将其编译为动态方法。这与定期编写的代码非常接近(从我的测试开始,它比反射快很多倍)。动态方法的创建是昂贵的,所以创建一次,多次使用。

static Func<object,object> CreateDelegate(PropertyInfo[] path)
{
    var rootType = path.First().DeclaringType;
    var param = Expression.Parameter(typeof(object));
    Expression access = Expression.Convert(param, rootType);
    foreach (var prop in path)
    {
        access = Expression.MakeMemberAccess(access, prop);
    }

    var lambda = Expression.Lambda<Func<object, object>>(
        Expression.Convert(access, typeof(object)),
        param
    ).Compile();

    return lambda;
}

static void Main(string[] args)
{
    var path = new[]
    {
        typeof(Root).GetProperty("Level1"),
        typeof(Level1).GetProperty("Level2"),
        typeof(Level2).GetProperty("Name")
    };

    var method = CreateDelegate(path);
    var data = new Root { Level1 = new Level1 { Level2 = new Level2 { Name = "Test" } } };
    var result = method(data);
}

参考文献:Dynamic MethodsExpression Tree-Compile