Предположим, у меня есть простой класс:ПолучитьЗначение() от переменного поля внутри класса
public class TestScript : MonoBehaviour {
public Vector3 myVector3;
}
Теперь я хочу итерацию через полей экземпляра этого класса и доступ к полям этого поля (Field-Ception!) И присваивать значения переменным правого типа, эффективно «обертывая» поле, чтобы его можно было сериализовать. Здесь я бы дошел до поля Vector3 «myVector3» и, достигнув его, переместил его поля и присвоил их значения трем поплавкам (из чего состоит вектор 3).
Проблема? FieldInfo. GetValue()
возвращает тип MonoField
! Если я использую fieldinfo. FieldType
, она возвращает Vector3
, но это не помогает мне, как мне нужно значение:/
TestScript myTestScript;//an instance of the MonoBehaviour class
const BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance;
//the fields... only 1 in this case (myVector3)
FieldInfo[] fields = myTestScript.GetType().GetFields(flags);
//store Type...
var tp = myTestScript.GetType();
//iterate over the fields
foreach FieldInfo field in fields) {
if (field != null) {
//check if the field is of Type Vector3
if(field.FieldType == typeof(Vector3)) {
const BindingFlags flags_v3 = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance;
//the following will give me an array of FieldInfo
//with Type MonoField, but I need the
//actual x, y and z (floats) fields!
FieldInfo[] fields_v3 = field.GetType().GetFields(flags);
//added with edit:
foreach(FieldInfo field_v3 in fields_v3) {
object value = field_v3 .GetValue(field)//the line in question... Since field.GetType returns MonoFields instead of the Vector3, I can not access the Vector3 Type's x y z fields/values.
}
}
}
}
Я не вижу вы звоните 'GetValue' здесь .. – Blorgbeard
Я советую удаление' BindingFlags.Static' из всех флагов, если вы хотите только сериализовать экземпляры. – IllidanS4
Извините за неясность и спасибо за отзыв. Я не включал фактические линии GetValue, потому что я чувствую, что проблема уже связана с полем field.GetType(). GetFields(), предоставляя мне массив MonoField вместо x y z, который плавает в Vector3. не говоря, что это ошибка или что-то в этом роде, просто не то, что мне нужно, потому что я не могу использовать GetValue с MonoField, чтобы получить нужные x y z float. Я добавил цикл foreach, чтобы сделать вещи более ясными (надеюсь). BindingFlags.static был удален, как рекомендовано. – Cherno