C#动态。 字符串属性路径

假设我有这些课程:

internal class A { public B Field { get; set; } } internal class B { public int SubField { get; set; } } 

有可能做这样的事情:

  var a = new A(); a.Field = new B(); a.Field.SubField = 10; dynamic d = a; var path = "Field.SubField"; var i = d.path; // How to look for field  instead of field ? 

你可以用reflection做到这一点。

 static object ReflectOnPath(object o, string path) { object value = o; string[] pathComponents = path.Split('.'); foreach (var component in pathComponents) { value = value.GetType().GetProperty(component).GetValue(value, null); } return value; } 

上面绝对没有错误检查; 你必须决定你想怎么做。

用法:

 var a = new A(); a.Field = new B(); a.Field.SubField = 10; string path = "Field.SubField"; Console.WriteLine(ReflectOnPath(a, path)); 

您甚至可以将其作为扩展方法,以便您可以说

 Console.WriteLine(a.ReflectOnPath("Field.SubField")); 

使用动态无法做你想做的事。 动态只是不是为了那个。

首先,如果您这样做,请考虑一下该行为应该是什么:

 dynamic d = a; var path = "Field.SubField"; var i = d.path 

而A类有自己的一个字段“路径”。

试图通过a.path(这意味着一个。“FieldSubfield”)来访问a.Field.Subfield,它只是在语法上不正确。 如果你想实现这一点,杰森写了一个非常好的例子,说明你如何做到(通过反思)。