예제 #1
0
        /// <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);
        }