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

Dynamic 如何动态/后期绑定访问属性?,dynamic,c#-4.0,late-binding,Dynamic,C# 4.0,Late Binding,我想实现一个方法,允许我以后期绑定/动态的方式访问未知/匿名对象(-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"); 下面是一个使用“经典”反射的简单实现:

我想实现一个方法,允许我以后期绑定/动态的方式访问未知/匿名对象(-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,我还有什么其他选项来实现类似于上面所示的东西,但可能更简单、性能更高,等等

也许有一些方法可以实现同样的效果,这将允许我使用lambda表达式而不是字符串来指定
表达式
?表达式树是否有任何帮助(如中所示)

更新:对象和表达式通过web服务调用传递到我的代码中。这就是为什么我在我的
Get()
方法中使用
object
string

您实际上只将表达式作为字符串吗?是否在编译时就知道类型本身是未知的(或者很难表达)?如果是:

如果你真的只是把它作为一个字符串(例如,作为用户输入的数据)来使用,那么生活就会变得更加艰难,而C#4的任何功能都不会真正帮助你。您可以将其评估为IronPython脚本或类似的东西

编辑:好的,在更新之后,听起来你处于后一种情况——在这种情况下,我不知道还有比使用反射更好的方法。一些为UI构建的内置属性绑定可能会有所帮助,但我不知道一种干净的访问方式。

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

作为另一种方法,您可以使用反射将对象的所有属性放入ExpandoObject中,然后像使用字典一样使用它(因为ExpandoObject实现IDictionary)。或者,您可以使用JSON.NET并调用
JObject.FromObject
,这将把一个常规对象转换成一个JObject,它可以以类似字典的样式访问(并且作为一个附加的优点,它支持递归图)。最后,您可以使用相同的方法将对象转储到字典字典中

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