3

目前,我的代码使用反射成功地设置了对象的字段/属性/数组的值,给定了从根对象到字段/属性的路径。

例如

//MyObject.MySubProperty.MyProperty
SetValue('MySubProperty/MyProperty', 'new value', MyObject);

上面的示例将“MyObject”对象的“MyProperty”属性设置为“新值”

我无法使用反射在结构中设置字段的值,该结构是结构数组的一部分,因为该结构是值类型(在数组内)。

这是一些测试类/结构......

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 = ''my new value" 和 myObject.myOtherStructArray[1].myOtherField = ''my new value"

我所需要的只是替换“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 回答