3

現時点では、私のコードは、ルートオブジェクトからフィールド/プロパティへのパスを指定して、リフレクションを使用してオブジェクトのフィールド/プロパティ/配列の値を正常に設定しています。

例えば

//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);」の代わりです。ライン

前もって感謝します

4

4 に答える 4

3

配列オブジェクト (特定の要素ではない) の FieldInfo を取得します。

配列の場合は、System.Array にキャストし、Array.SetValue を使用してオブジェクトの値を設定します。

于 2009-03-21T01:11:36.897 に答える
2

ボックス化/ボックス化解除のため、以下は、あらゆる種類の構造体メンバーに対して、探していることを正確に実行する必要があります。

var property = this.GetType().GetProperty(myPropertyName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
ValueType vthis = this;
property.SetValue(vthis, myValue, null); // myValue is the value/object to be assigned to the property.
this = (UnderlyingsList)vthis;
于 2011-06-17T16:04:16.817 に答える
1

私が推測しなければならなかった場合、バグはあなたが省略したコードの一部であり、具体的には次のように思われます。

    foundObject = //If element is [Blah] then get the
                  //object at the specified list position

は(意図せずに)指定されたリスト位置にあるオブジェクトのコピーfoundObjectに設定されます。

于 2009-03-20T23:39:41.453 に答える
0

私の質問は続きました...

フィールドである構造体にフィールド/プロパティを設定していた同様の問題に対して私が見つけた唯一の解決策は、使用することでした...

//GrandParentObject is myObject
//GrandParentType is typeof(MyClass)
//FieldIWantedToSet is the field info of myStruct.FieldIWantedToSet
FieldInfo oFieldValueTypeInfo = GrandParentType.GetField("myStruct");
TypedReference typedRefToValueType = TypedReference.MakeTypedReference(GrandParentObject, new FieldInfo[] { oFieldValueTypeInfo });
FieldIWantedToSet.SetValueDirect(typedRefToValueType, "my new value"); 

問題は、構造体の配列/リストでSetValueDirectをどのように使用できるかです。構造体のFieldInfoを取得できないため(配列内にあるため)、構造体が配列内にある場合、上記の古いメソッドは機能しないと思いますか?

于 2009-03-21T00:08:58.340 に答える