【问题标题】:Get Property Value from Nested Objects - Efficient Ways than Reflection从嵌套对象中获取属性值 - 比反射更有效的方法
【发布时间】:2017-09-12 05:58:36
【问题描述】:

我的用例可以有数千个类的实例。该类中的一个属性也与一个类的类型相同,并且可以继续下去。

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

我发现递归是 one(Getting Nested Object Property Value Using Reflection) 和 GetNestedTypes(https://msdn.microsoft.com/en-us/library/493t6h7t(v=vs.110).aspx) 的详尽使用。

我读到反射很昂贵,所以我的问题是,有没有其他方法可以在不使用反射概念的情况下搜索属性?

【问题讨论】:

  • 您能否向我们展示一个stackoverflow.com/help/mcve,其中包含一些示例输入和预期输出? 这将有助于我们在进入解决方案模式之前了解您的问题。
  • 反射如果做得不好,可能会很昂贵。如果你缓存你得到的结果,那么使用反射不会造成太大的伤害,甚至会和静态方法一样好。

标签: c# algorithm c#-4.0 reflection


【解决方案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

【讨论】:

  • 我已经建立了一个动态表达式,就像你描述的那样。它适用于例如 LessThan 或 GreaterThan 表达式。但是如果我将两个表达式加在一起,它使用'&'符号,我要求它是字符串'AND'。请告诉我如何解决这个问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 2010-12-29
相关资源
最近更新 更多