次の問題を解決しようとしています。任意の構造のオブジェクトと、フィールド名を表す文字列の配列があります。この配列は、リフレクションを使用して特定のフィールドを取得するために使用されるパスです。次に、最終フィールドに格納する必要がある値があります。たとえば、次のクラス階層を考えてみましょう。
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#でこれを行う方法は?
また、ルート オブジェクト自体に別の値を割り当てる必要があるパスが空の場合のエッジ ケースもサポートする必要があります。
編集:私のコードは、実際にはより複雑なアプローチを使用してメンバーを取得します。パスのエントリは必ずしもフィールド名ではなく、プロパティ名、配列またはリストのインデックス、ディクショナリのキーなどである場合もあります。したがって、それをラップするクラスは複雑になります。もっと簡単な解決策を探しています。