0

単純なクラスがあるとします:

 public class TestScript : MonoBehaviour {
      public Vector3 myVector3;
 }

ここで、このクラスのインスタンスのフィールドを反復処理し、このフィールドのフィールド (Field-Ception!) にアクセスして、適切なタイプの変数に値を割り当て、フィールドを効果的に「ラップ」して、連載。ここでは、Vector3 フィールド "myVector3" に到達し、そこに到達したら、そのフィールドを調べて、それらの値を 3 つのフロート (Vector3 を構成するもの) に割り当てます。

問題?フィールド情報。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.
                }
           }
      }
 }
4

1 に答える 1

1

field.GetType()実際の反射オブジェクトのタイプを返しますMonoField。この場合は です。を使用field.FieldTypeします。このプロパティには、フィールド自体に格納されている値の型が含まれています。

FieldInfo[] fields_v3 = field.FieldType.GetFields(flags);
于 2015-04-19T20:31:09.250 に答える