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 + "] 不存在");
        }
        public override void SetValue(string strName, ScriptObject value)
        {
            ScriptUserdataField field = GetField(strName);

            if (field == null)
            {
                throw new ScriptException("Type[" + ValueType + "] 变量 [" + strName + "] 不存在");
            }
            field.SetValue(Value, Util.ChangeType(value, field.fieldType));
        }
        private ScriptUserdataField GetField(string strName)
        {
            if (m_FieldInfos.ContainsKey(strName))
            {
                return(m_FieldInfos[strName]);
            }
            ScriptUserdataField field = new ScriptUserdataField();

            field.name = strName;
            FieldInfo info = ValueType.GetField(strName);

            if (info != null)
            {
                field.field     = info;
                field.fieldType = info.FieldType;
                m_FieldInfos.Add(strName, field);
                return(field);
            }
            MethodInfo method = ValueType.GetMethod("get_" + strName);

            if (method != null)
            {
                field.getMethod = method;
                field.fieldType = method.ReturnType;
                field.setMethod = ValueType.GetMethod("set_" + strName);
                m_FieldInfos.Add(strName, field);
                return(field);
            }
            method = ValueType.GetMethod("set_" + strName);
            if (method != null)
            {
                field.setMethod = method;
                field.fieldType = method.GetParameters()[0].ParameterType;
                field.getMethod = ValueType.GetMethod("get_" + strName);
                m_FieldInfos.Add(strName, field);
                return(field);
            }
            return(null);
        }