うにてぃブログ

主にUnityとC#に関する記事を書いていきます

Reflection

【C#】リフレクションで IList のインスタンスを作成する

private object CreateListInstance<T>(T[] values) { var elementType = typeof(T); var listType = typeof(List<>).MakeGenericType(elementType); var list = (IList) Activator.CreateInstance(listType); for (var i = 0; i < values.Length; i++) list.Ad</t>…

【C#】リフレクションで Array のインスタンスを作成する

private object CreateArrayInstance<T>(T[] values) { var elementType = typeof(T); var array = (Array) Activator.CreateInstance(elementType, values.Length); for (var i = 0; i < values.Length; i++) array.SetValue(values[i], i); return array; }</t>

【C#】継承した Generic クラスを確認する

GenericInt が Generic<T> を継承しているか確認するために、BaseType を見てみたところ Generic1[System.Int32]` と表示され意図したクラスが取得できなかった public abstract class Generic<T>{} public class GenericInt : Generic<int>{} private void Main() { va</int></t></t>…

【C#】クラスを DeepCopy する

クラスをコピーする場合、自前でコピーするメソッドを作成する必要があります フィールドの追加などがあるとそのたびにコピー処理を直すのも面倒なので Reflection を利用して DeepCopy する拡張メソッドを作成しました サンプル 使い方は簡単でクラスのイン…

【Unity】インスタンスID から Object を探す

Editor 上でなら EditorUtility.InstanceIDToObject を利用すれば インスタンスID から Object を取得することができる が Editor 上じゃない場合は上記メソッドは利用できないので 全 Object を見てインスタンスIDを探すような処理を記述する必要がある な…

【Unity】FieldInfo もしくは Type が Unity でシリアライズできるかを調べる拡張メソッド

using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using UnityEngine; public static class FieldInfoExtension { public static bool IsSerializable(this FieldInfo fieldInfo) { var attributes = fieldInf…

【C#】Reflection 処理まとめ

メモがてらまとめる 子クラスかどうか 親のクラス インナークラスの取得 継承クラスを全検索 インスタンス生成 すべての Type の中から検索 メソッド実行 static なメソッドを実行 プロパティ取得 static なプロパティ取得 ジェネリックメソッドの実行 メソ…

【C#】ジェネリックメソッドをリフレクションで呼び出す

ジェネリックメソッドを呼び出す場合は MethodInfo から MakeGenericMethod を利用して、再度 MethodInfo を取得する必要がある public class Sample { public void Exec<T>() where T : class { Debug.Log(typeof(T)); } } 例えば上記クラスの Exec メソッドを</t>…

【C#】メソッドをオーバーライドしているかどうか判定する

using System; using System.Reflection; private static bool IsOverrideMethod(Type type, string methodName) { var method = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic); if (method == null) return false; return m…

【Unity】SerializedProperty の Type や FieldInfo を取得する

SerializedProperty.propertyPath から . 区切りで手繰っていけば FieldInfo が取得できるので Type が取得できる using System; using System.Reflection; using UnityEditor; using UnityEngine; public static class SerializedPropertyUtility { /// <summary> //</summary>…

【Unity】Reflection を利用して Unity の internal 処理を利用する

internal と書いてあるけど private でも問題無くできます static ではない場合はインスタンスを取得する必要がある のでインスタンス取得処理も記述してあります ※全部ProjectBrowserですが・・・ Type の取得 // ProjectBrowser の Typeを取得 var type = …

【Unity】UnityEditor で Unityデフォルトの EditorWindow を取得する

EditorWindow を取得する方法として EditorWindow.GetWindow があるが これはすでに EditorWindow を開いていた場合でも新しく EditorWindowを作成してしまう すでに開いている EditorWindow を確認する方法として以下がある var findSceneView = Resources.…

【Unity】MonoBehaviour の メソッドを登録してデバッグしやすくする

あらまし 開発中にデバッグメニューを作成時に機能を追加する度に どのウィンドウに表示させるか決めて、表示名を決めて等の作業が面倒になる そのため、フラグだけ建てておけば自動的に登録されていく機構があれば便利である 実装 メソッドに利用できる Att…

【Unity】Type の FieldInfo を serializedObject.FindProperty で取得できるように 再帰的に取得するコード

Array や List の場合は要素のTypeを取得する必要があるためチェック処理を入れている また、System系の構造体やクラスだと無限ループすることがあったので Array や List 以外の System系は無視している ※Array や List の Path には非対応 private static …