Ejemplo n.º 1
0
        /// <summary> 获得一个类变量 </summary>
        public override object GetValue_impl(object obj, string name)
        {
            if (m_Functions.ContainsKey(name))
            {
                return(m_Functions[name]);
            }
            if (m_NestedTypes.ContainsKey(name))
            {
                return(m_NestedTypes[name]);
            }
            UserdataVariable variable = GetVariable(name);

            if (variable != null)
            {
                return(variable.GetValue(obj));
            }
            ScriptUserdata nestedType = GetNestedType(name);

            if (nestedType != null)
            {
                return(nestedType);
            }
            UserdataMethod func = GetMethod(name);

            if (func != null)
            {
                return(func);
            }
            throw new ExecutionException(m_Script, "GetValue Type[" + m_Type.ToString() + "] 变量 [" + name + "] 不存在");
        }
        public override ScriptObject GetValue(string strName)
        {
            if (m_Functions.ContainsKey(strName))
            {
                return(m_Functions[strName]);
            }
            if (m_NestedTypes.ContainsKey(strName))
            {
                return(m_NestedTypes[strName]);
            }
            ScriptUserdataField field = GetField(strName);

            if (field != null)
            {
                return(Script.CreateObject(field.GetValue(Value)));
            }
            Type nestedType = ValueType.GetNestedType(strName, Script.BindingFlag);

            if (nestedType != null)
            {
                ScriptUserdata ret = Script.CreateUserdata(nestedType);
                m_NestedTypes.Add(strName, ret);
                return(ret);
            }
            throw new ScriptException("Type[" + ValueType.ToString() + "] Variable[" + strName + "] 不存在");
        }
Ejemplo n.º 3
0
            public object Call(ScriptObject[] args)
            {
                ScriptUserdata assembly = args[0] as ScriptUserdata;

                Util.Assert(assembly != null, m_script, "push_assembly 参数必须是 Assembly 类型");
                m_script.PushAssembly(assembly.ObjectValue as Assembly);
                return(null);
            }
Ejemplo n.º 4
0
            public object Call(ScriptObject[] args)
            {
                Util.Assert(args.Length == 2, m_script, "toenum 第一个参数是枚举类 第二个参数必须是number类型");
                ScriptUserdata obj    = args[0] as ScriptUserdata;
                ScriptNumber   number = args[1] as ScriptNumber;

                Util.Assert(obj != null && number != null, m_script, "toenum 第一个参数是枚举类 第二个参数必须是number类型");
                return(new ScriptEnum(m_script, Util.ToEnum(obj.ValueType, number.ToInt32())));
            }
Ejemplo n.º 5
0
            public UserdataPairs(ScriptUserdata userdata, ScriptMap itorResult)
            {
                var ienumerable = userdata.Value as System.Collections.IEnumerable;

                if (ienumerable == null)
                {
                    throw new ExecutionException("pairs 只支持继承 IEnumerable 的类");
                }
                m_Enumerator = ienumerable.GetEnumerator();
                m_ItorResult = itorResult;
            }
Ejemplo n.º 6
0
            public object Call(ScriptObject[] args)
            {
                ScriptUserdata assembly = args[0] as ScriptUserdata;

                if (assembly == null)
                {
                    throw new ExecutionException("push_assembly 参数必须是 Assembly 类型");
                }
                m_script.PushAssembly(assembly.ObjectValue as Assembly);
                return(null);
            }
Ejemplo n.º 7
0
            public UserdataPairs(ScriptUserdata obj)
            {
                object value = obj.Value;

                System.Collections.IEnumerable ienumerable = value as System.Collections.IEnumerable;
                if (ienumerable == null)
                {
                    throw new ExecutionException("pairs 只支持继承 IEnumerable 的类");
                }
                m_Enumerator = ienumerable.GetEnumerator();
            }
Ejemplo n.º 8
0
        private ScriptUserdata GetNestedType(string name)
        {
            Type nestedType = m_Type.GetTypeInfo().GetNestedType(name, Script.BindingFlag);

            if (nestedType != null)
            {
                ScriptUserdata ret = m_Script.CreateUserdata(nestedType);
                m_NestedTypes.Add(name, ret);
                return(ret);
            }
            return(null);
        }
Ejemplo n.º 9
0
        private ScriptUserdata GetNestedType(string name)
        {
            Type nestedType = base.m_Type.GetTypeInfo().GetNestedType(name, BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance);

            if (nestedType != null)
            {
                ScriptUserdata userdata = base.m_Script.CreateUserdata(nestedType);
                this.m_NestedTypes.Add(name, userdata);
                return(userdata);
            }
            return(null);
        }
Ejemplo n.º 10
0
            public object Call(ScriptObject[] args)
            {
                ScriptUserdata userdata = args[0] as ScriptUserdata;

                Util.Assert(userdata != null, m_script, "generic_type 第1个参数必须是 userdata");
                Type[] types = new Type[args.Length - 1];
                for (int i = 1; i < args.Length; ++i)
                {
                    ScriptUserdata type = args[i] as ScriptUserdata;
                    Util.Assert(type != null, m_script, "generic_type 第" + (i + 1) + "参数必须是 userdata");
                    types[i - 1] = type.ValueType;
                }
                return(m_script.GetScorpioType(userdata.ValueType).MakeGenericType(types));
            }
Ejemplo n.º 11
0
            public object Call(ScriptObject[] args)
            {
                ScriptMethodFunction func = args[0] as ScriptMethodFunction;

                Util.Assert(func != null, m_script, "generic_method 第1个参数必须是 function");
                ScorpioMethod method = func.Method;

                Type[] types = new Type[args.Length - 1];
                for (int i = 1; i < args.Length; ++i)
                {
                    ScriptUserdata type = args[i] as ScriptUserdata;
                    Util.Assert(type != null, m_script, "generic_method 第" + (i + 1) + "参数必须是 userdata");
                    types[i - 1] = type.ValueType;
                }
                return(method.MakeGenericMethod(types));
            }
Ejemplo n.º 12
0
            public object Call(ScriptObject[] args)
            {
                ScriptUserdata userdata = args[0] as ScriptUserdata;

                if (userdata == null)
                {
                    throw new ExecutionException("generic_type 参数必须是 userdata");
                }
                Type[] types = new Type[args.Length - 1];
                for (int i = 1; i < args.Length; ++i)
                {
                    ScriptUserdata type = args[i] as ScriptUserdata;
                    if (userdata == null)
                    {
                        throw new ExecutionException("generic_type 参数必须是 userdata");
                    }
                    types[i - 1] = type.ValueType;
                }
                return(userdata.ValueType.MakeGenericType(types));
            }
Ejemplo n.º 13
0
        /// <summary> 获得一个类变量 </summary>
        public override object GetValue(object obj, string name)
        {
            if (m_ScorpioMethods.ContainsKey(name))
            {
                return(m_ScorpioMethods[name]);
            }
            if (m_Functions.ContainsKey(name))
            {
                return(GetMethod(obj, name, m_Functions[name]));
            }
            if (m_NestedTypes.ContainsKey(name))
            {
                return(m_NestedTypes[name]);
            }
            UserdataVariable variable = GetVariable(name);

            if (variable != null)
            {
                return(variable.GetValue(obj));
            }
            Type nestedType = m_Type.GetNestedType(name, Script.BindingFlag);

            if (nestedType != null)
            {
                ScriptUserdata ret = m_Script.CreateUserdata(nestedType);
                m_NestedTypes.Add(name, ret);
                return(ret);
            }
            UserdataMethod func = GetMethod(name);

            if (func != null)
            {
                return(GetMethod(obj, name, func));
            }
            throw new ExecutionException(m_Script, "GetValue Type[" + m_Type.ToString() + "] 变量 [" + name + "] 不存在");
        }