using System; using System.IO; using System.Text; using System.Reflection; #if UNITY_EDITOR using UnityEngine; using UnityEditor; #endif namespace UniJSON { public static partial class ConcreteCast { public static string GetMethodName(Type src, Type dst) { return string.Format("Cast{0}To{1}", src.Name, dst.Name); } public static MethodInfo GetMethod(Type src, Type dst) { var name = GetMethodName(src, dst); var mi = typeof(ConcreteCast).GetMethod(name, BindingFlags.Static | BindingFlags.Public); return mi; } #if UNITY_EDITOR static Type[] s_castTypes = new Type[] { typeof(byte), typeof(ushort), typeof(uint), typeof(ulong), typeof(sbyte), typeof(short), typeof(int), typeof(long), typeof(float), typeof(double), }; public static void GenerateGenericCast() { var s = new StringBuilder(); using (var w = new StringWriter(s)) { w.WriteLine(@" using System; namespace UniJSON { public static partial class ConcreteCast { "); foreach (var x in s_castTypes) { foreach (var y in s_castTypes) { w.WriteLine(@" public static $1 $2($0 src) { return ($1)src; } ".Replace("$0", x.Name).Replace("$1", y.Name).Replace("$2", GetMethodName(x, y))); } } w.WriteLine(@" } } "); } var path = Application.dataPath + SOURCE; Debug.LogFormat("{0}", path); File.WriteAllText(path, s.ToString().Replace("\r\n", "\n"), new UTF8Encoding(false)); AssetDatabase.ImportAsset("Assets" + SOURCE); } const string SOURCE = "/VRM/UniJSON/Scripts/ConcreteCast.g.cs"; #endif } }