UnityのRefrection使っているコードみてて次の二点の挙動が気になったので調べた
- setterがない場合
- setterの中で別の処理をいれていた場合その処理も実行されるかどうか
動かしてる環境がUnityなだけで実態はC#の話かな
次のようなRefrectionをしてプロパティの値を変更する
public class MyGameObject : MonoBehaviour
{
[SerializeField]
int myNumber;
public int MyNumber
{
get { return myNumber; }
}
}
public class RefrectionController : MonoBehaviour
{
[SerializeField]
MyGameObject myGo;
void Start()
{
Debug.Log("[LOG] 1 myGo.MyNumber = " + myGo.MyNumber);
var propertyInfo = myGo.GetType().GetProperty("MyNumber", BindingFlags.Public | BindingFlags.Instance);
// テキトーに数字の更新をする
propertyInfo.SetValue(myGo, 1, null);
Debug.Log("[LOG] 2 myGo.MyNumber = " + myGo.MyNumber);
}
}
出力結果 (StackTrace除外)
[LOG] 1 myGo.MyNumber = 0
ArgumentException: Set Method not found for 'MyNumber'
次にSetterを生やしてログを仕込みそれが出力されるかみる
public class MyGameObject : MonoBehaviour
{
[SerializeField]
int myNumber;
public int MyNumber
{
get { return myNumber; }
set
{
Debug.Log("Set myNumber");
myNumber = value;
}
}
}
出力結果 (StackTrace除外)
[LOG] 1 myGo.MyNumber = 0
[LOG] Set myNumber
[LOG] 2 myGo.MyNumber = 1
Setterに追加した処理も呼ばれていた。そうなるよね。