我想设置使用反射,但使得能够访问多个子对象的设置函数值。 我有没有问题,当子对象是类,但结构它不工作。
在例子中,我有下面的类和结构
class MyConfig
{
Gravity gravity;
}
struct Gravity
{
Vector2 direction;
}
struct Vector2
{
float X,Y;
}
我希望能够设置值是这样的:
MyConfig cfg=new MyConfig();
setValueViaReflection (cfg,"gravity.direction.X",76.5f);
这显然应设置cfg.gravity.direction.X到76.5f
我的代码,现在是这样的:
void setValueViaReflection (object obj,string fieldName,object value)
{
int i;
TypeInfo baseType=null;
FieldInfo field;
string []split=fieldName.Split ('.');
// get one subobject in each iteration
for (i=0;i<split.Count()-1;i++)
{
string fname=split[i];
baseType=obj.GetType().GetTypeInfo();
field=baseType.GetDeclaredField (fname);
if (field==null) return;
obj=field.GetValue (obj);
if (obj==null) return;
}
// finally you've got the final type, set value
baseType=obj.GetType().GetTypeInfo();
field=baseType.GetDeclaredField (split[split.Count()-1]);
if (field==null) return;
field.SetValue (obj,value);
}
我知道,我应该使用SetValueDirect,但使用它没有什么区别(该值在“目标文件”修改,但似乎是一个值类型,因此它不改变原来的对象。
我认为这个问题是在field.GetValue它创建一个值类型,使得最终SetValueDirect没用。
代码工作好,如果重力和Vector2设置为类。