我正在尝试解决以下问题。我们有一个任意结构的对象和一个表示字段名称的字符串数组。该数组是用于使用反射检索特定字段的路径。然后有一个值应该存储在最终字段中。例如,考虑以下类层次结构:
class A {
public int i;
}
class B {
public A a;
}
class C {
public B b;
}
class D {
public C c;
}
假设我们以某种方式获得输入:
object obj = GetObject(); // e.g. returns object of type D
List<string> path = GetPathToStore(); // e.g. returns {"c", "b", "a", "i"}
object value = GetValueToBeStored(); // e.g. returns 42
我写了以下循环:
foreach (string fieldName in path) {
FileInfo fieldInfo = obj.GetType().GetField(fieldName);
obj = fieldInfo.GetValue(obj);
}
那么有这样的东西会很好:
obj = value;
但这只会改变引用而不是对象中的实际字段。在 C++ 中,我会写:
*obj = value;
但是如何在 C# 中做到这一点?
当路径为空时,我还需要支持边缘情况,在这种情况下,需要为根对象本身分配不同的值。
编辑:我的代码实际上使用更复杂的方法来检索成员。路径中的条目不一定是字段名称,它们也可以是属性名称、数组或列表中的索引、字典中的键等。因此,包装它的类会很复杂。我正在寻找一个更简单的解决方案。