現時点では、私のコードは、ルートオブジェクトからフィールド/プロパティへのパスを指定して、リフレクションを使用してオブジェクトのフィールド/プロパティ/配列の値を正常に設定しています。
例えば
//MyObject.MySubProperty.MyProperty
SetValue('MySubProperty/MyProperty', 'new value', MyObject);
上記の例では、「MyObject」オブジェクトの「MyProperty」プロパティを「newvalue」に設定します。
構造体は値型(配列内)であるため、リフレクションを使用して構造体の配列の一部である構造体のフィールドの値を設定することはできません。
ここにいくつかのテストクラス/構造体があります...
public class MyClass {
public MyStruct[] myStructArray = new MyStruct[] {
new MyStruct() { myField = "change my value" }
};
public MyStruct[] myOtherStructArray = new MyStruct[] {
new MyStruct() { myOtherField = "change my value" },
new MyStruct() { myOtherField = "change my other value" }
};
}
public struct MyStruct { public string myField; public string myOtherField; }
以下は、リスト内の通常のプロパティ/フィールドと小道具/フィールドの値を正常に設定する方法です...
public void SetValue(string pathToData, object newValue, object rootObject)
{
object foundObject = rootObject;
foreach (string element in pathToData.Split("/"))
{
foundObject = //If element is [Blah] then get the
//object at the specified list position
//OR
foundObject = //Else get the field/property
}
//Once found, set the value (this is the bit that doesn't work for
// fields/properties in structs in arrays)
FieldInf.SetValue(foundObject, newValue);
}
object myObject = new MyClass();
SetValue("/myStructArray/[0]/myField", "my new value", myObject);
SetValue("/myOtherStructArray/[1]/myOtherField", "my new value", myObject);
その後、myObject.myStructArray [0] .myField ='' mynewvalue"およびmyObject.myOtherStructArray[1].myOtherField ='' mynewvalue"が必要です。
必要なのは、「FieldInf.SetValue(foundObject、newValue);」の代わりです。ライン
前もって感謝します