代码之家  ›  专栏  ›  技术社区  ›  M4N

如何动态/后期访问属性?

  •  1
  • M4N  · 技术社区  · 14 年前

    我想实现一个方法,允许我以后期绑定/动态的方式访问未知/匿名对象(-graph)的属性(我甚至不知道如何正确调用它)。

    // setup an anonymous object
    var a = new { B = new { C = new { I = 33 } } };
    
    // now get the value of a.B.C.I in a late-bound way
    var i = Get(a, "B.C.I"); 
    

    下面是一个使用“经典”反射的简单实现:

    public static object Get(object obj, string expression)
    {
        foreach (var name in expression.Split('.'))
        {
            var property = obj.GetType().GetProperty(name);
            obj = property.GetValue(obj, null);
        }
        return obj;
    }
    

    对于C#/.NET4,我还有什么其他选项来实现类似于上面所示的东西,但可能更简单、性能更高,等等。?

    expression 使用lambda表达式而不是字符串?表达式树是否有任何帮助(如中所示) this question )?

    更新 :对象和表达式通过web服务调用传递到我的代码中。所以我用 object string 在我的 Get() 方法。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Jon Skeet    14 年前

    你…吗 表达式只能作为字符串吗?在编译时是否知道类型本身是未知的(或者很难表达)?如果是:

    dynamic d = a;
    int i = d.B.C.I;
    

    真正地 只把它作为一个字符串(例如,作为用户输入的数据),这会让你的生活变得更加困难,而C#4的任何特性都不能真正帮助你。你可以用IronPython脚本或者类似的东西来评估它。。。

        2
  •  1
  •   Community Nick Dandoulakis    7 年前

    如果您想使用C风格,可以将Mono编译器用作应用程序中的服务。我在这里描述如何做到这一点: Mono Compiler as a Service (MCS)

    作为另一种方法,可以使用反射将对象的所有属性放入ExpandoObject,然后像使用字典一样使用它(因为ExpandoObject实现了IDictionary)。或者,你可以使用JSON.NET打电话给我 JObject.FromObject