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,它只是在语法上不正确。 如果你想实现这一点,杰森写了一个非常好的例子,说明你如何做到(通过反思)。