【发布时间】:2015-05-18 23:09:16
【问题描述】:
我想使用反射设置值,但使设置函数能够访问多个子对象。当子对象是类时我没有问题,但是对于结构它不起作用。
例如,我有以下类和结构
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,但使用它没有区别(值在“obj”中修改,但似乎是一个值类型,因此它不会改变原始对象。
我认为问题出在 field.GetValue 中,它创建了一个值类型,使最终的 SetValueDirect 无用。
如果将 Gravity 和 Vector2 设置为类,则代码运行良好。
【问题讨论】:
-
我相信你必须明确地装箱结构变量。 Related answer
-
您必须在父级上设置从GetValue返回的值(如果是值类型)。
-
这是避免可变值类型的众多原因之一。
-
这篇文章可能对你有帮助stackoverflow.com/questions/13307998/…
标签: c# reflection struct