/// <summary> /// DefineCSharpClass in ruby and set data type /// </summary> /// <param name="state"></param> /// <param name="type"></param> /// <returns></returns> public static IntPtr DefineCSharpClass(RubyState state, Type type) { // 模块和类的开头必须是大写字母 IntPtr @class = IntPtr.Zero; string[] namespacePath = type.FullName.Split('.'); if (namespacePath.Length == 1) { @class = RubyDLL.r_define_class(state, type.Name, state.SystemObjectRClass); } else { foreach (var name in namespacePath) { string validName = name; // 检查命名开头字母大小写 if (!char.IsUpper(name[0])) { char head = char.ToUpper(name[0]); string newName = name; newName = name.Remove(0, 1); newName = newName.Insert(0, head.ToString()); Console.WriteLine($"{name} -> {newName}"); validName = newName; } if (name.Equals(namespacePath[0])) { @class = RubyDLL.r_define_module(state, validName); RubyDLL.mrb_set_instance_tt(@class, rb_vtype.RUBY_T_DATA); } else if (name.Equals(namespacePath[namespacePath.Length - 1])) { @class = RubyDLL.r_define_class_under(state, @class, validName, state.SystemObjectRClass); RubyDLL.mrb_set_instance_tt(@class, rb_vtype.RUBY_T_DATA); } else { @class = RubyDLL.r_define_module_under(state, @class, validName, IntPtr.Zero); RubyDLL.mrb_set_instance_tt(@class, rb_vtype.RUBY_T_DATA); } } } return(@class); }