Я хочу установить значения, используя отражение, но делая функцию настройки доступной для нескольких подобъектов. У меня нет проблем, когда подобъекты являются классами, но с структурами он не работает.C# Итеративное отражение
В примере, у меня есть следующий класс и структура
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», но похоже, это тип значения, поэтому он не меняет исходный объект.
Я думаю, проблема в поле. GetValue, который создает тип значения, делая окончательный SetValueDirect бесполезным.
Код работает хорошо, если Gravity и Vector2 заданы как классы.
Я считаю, что вам придется явно указывать структурные переменные. [Соответствующий ответ] (http://stackoverflow.com/a/13308275/147613) – Amit
Вы должны установить значение, возвращаемое из GetValue в родительском (если это тип значения). – Brannon
Это одна из многих причин того, почему вам следует избегать типа изменяемого значения. – Servy