2015-04-19 11 views
0

Предположим, у меня есть простой класс:ПолучитьЗначение() от переменного поля внутри класса

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. 
       } 
      } 
     } 
} 
+0

Я не вижу вы звоните 'GetValue' здесь .. – Blorgbeard

+0

Я советую удаление' BindingFlags.Static' из всех флагов, если вы хотите только сериализовать экземпляры. – IllidanS4

+0

Извините за неясность и спасибо за отзыв. Я не включал фактические линии GetValue, потому что я чувствую, что проблема уже связана с полем field.GetType(). GetFields(), предоставляя мне массив MonoField вместо x y z, который плавает в Vector3. не говоря, что это ошибка или что-то в этом роде, просто не то, что мне нужно, потому что я не могу использовать GetValue с MonoField, чтобы получить нужные x y z float. Я добавил цикл foreach, чтобы сделать вещи более ясными (надеюсь). BindingFlags.static был удален, как рекомендовано. – Cherno

ответ

1

field.GetType() возвращает тип реального объекта отражения, который MonoField, в этом случае. Используйте field.FieldType, это свойство содержит тип значения, хранящегося в самой области:

FieldInfo[] fields_v3 = field.FieldType.GetFields(flags); 
+0

Спасибо за предложение, я попробую его немедленно. Я не знал, что это может быть «сковано» вместе так. Редактировать: Да, действительно, он решил первую часть моей проблемы. Теперь у меня есть правый массив fieldinfo (x, y, z). Тем не менее, я все еще в темноте, когда речь заходит об использовании GetValue: – Cherno

+0

'значение кода объекта = field_v3.GetValue (поле)' Выдает ошибку: 'ArgumentException: поле«х», определенный на типе«Vector3» не является полем на целевом объекте, который имеет тип «MonoField». – Cherno

+0

@Cherno Under foreach: 'object vector = field.GetValue (myTestScript);' Then' object value = field_v3.GetValue (vector); 'Fields are специфичный для типа, а не для экземпляра. – IllidanS4