目前,我的代码使用反射成功设置了对象的fields / properties / arrays的值,给出了根对象的字段/属性的路径。
e.g。
//MyObject.MySubProperty.MyProperty
SetValue('MySubProperty/MyProperty', 'new value', MyObject);
上面的例子将'MyObject'对象的'MyProperty'属性设置为'new value'
我无法使用反射在结构中设置字段的值,该结构是结构数组的一部分,因为结构是值类型(在数组中)。
以下是一些测试类/结构...
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 =''我的新值“和 myObject.myOtherStructArray [1] .myOtherField =''我的新价值“
我只需要替换'FieldInf.SetValue(foundObject,newValue);'线
提前致谢
答案 0 :(得分:3)
获取数组对象的FieldInfo(不是特定元素)。
如果是数组,则将其强制转换为System.Array并使用Array.SetValue设置对象的值。
答案 1 :(得分: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;
答案 2 :(得分:1)
如果我不得不猜测,该错误是您省略的代码的一部分,特别是我怀疑:
foundObject = //If element is [Blah] then get the
//object at the specified list position
(无意中)将foundObject
设置为指定列表位置的对象的副本。
答案 3 :(得分: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(因为它在阵列)?