//
    // arg: a,b,c
    //
    public static string BuildCallString(Type classType, MemberInfo memberInfo, string argList, MemberFeature features, string newValue = "")
    {
        bool bGenericT = classType.IsGenericTypeDefinition;
        string memberName = memberInfo.Name;
        bool bIndexer = ((features & MemberFeature.Indexer) > 0);
        bool bStatic = ((features & MemberFeature.Static) > 0);
        bool bStruct = classType.IsValueType;
        string typeFullName = JSNameMgr.GetTypeFullName(classType);
        bool bField = (memberInfo is FieldInfo);
        bool bProperty = (memberInfo is PropertyInfo);
        bool bGet = ((features & MemberFeature.Get) > 0);
        bool bSet = ((features & MemberFeature.Set) > 0);
        if ((bGet && bSet) || (!bGet && !bSet)) { return ">>>> sorry >>>>"; }

        StringBuilder sb = new StringBuilder();

        if (bField || bProperty)
        {
            if (!bGenericT)
            {
                var strThis = typeFullName;
                if (!bStatic)
                {
                    strThis = "_this";
                    sb.AppendFormat("        {0} _this = ({0})vc.csObj;\n", typeFullName);
                }

                var result = string.Empty;
                if (bGet)
                {
                    // Լ�������صĽ���� result
                    result = "var result = ";
                }

                if (bIndexer)
                    sb.AppendFormat("        {2}{0}[{1}]", strThis, argList, result);
                else
                    sb.AppendFormat("        {2}{0}.{1}", strThis, memberName, result);

                if (bGet)
                {
                    sb.Append(";\n");
                }
                else
                {
                    sb.AppendFormat(" = {0};\n", newValue);
                    if (!bStatic && bStruct)
                    {
                        sb.Append("        JSMgr.changeJSObj(vc.jsObjID, _this);\n");
                    }
                }
            }
            else
            {
                // Լ���������Ǹ��ý� member
                if (bIndexer || !bIndexer) // 2��һ��
                {
                    if (bProperty)
                    {
                        sb.AppendFormat("        {4}member.{0}({1}, {2}new object[][[{3}]]);\n",
                            bGet ? "GetValue" : "SetValue",
                            bStatic ? "null" : "vc.csObj",
                            bSet ? newValue + ", " : "",
                            argList,
                            bGet ? "var result = " : "");
                    }
                    else
                    {
                        sb.AppendFormat("        {3}member.{0}({1}{2});\n",
                            bGet ? "GetValue" : "SetValue",
                            bStatic ? "null" : "vc.csObj",
                            bSet ? ", " + newValue : "",
                            bGet ? "var result = " : "");
                    }
                }
            }
        }
        return sb.ToString();
    }
예제 #2
0
    //
    // arg: a,b,c
    //
    public static string BuildCallString(Type classType, MemberInfo memberInfo, string argList, MemberFeature features,
                                         string newValue = "")
    {
        bool   bGenericT    = classType.IsGenericTypeDefinition;
        string memberName   = memberInfo.Name;
        bool   bIndexer     = (features & MemberFeature.Indexer) > 0;
        bool   bStatic      = (features & MemberFeature.Static) > 0;
        bool   bStruct      = classType.IsValueType;
        string typeFullName = JSNameMgr.GetTypeFullName(classType);
        bool   bField       = memberInfo is FieldInfo;
        bool   bProperty    = memberInfo is PropertyInfo;
        bool   bGet         = (features & MemberFeature.Get) > 0;
        bool   bSet         = (features & MemberFeature.Set) > 0;

        if ((bGet && bSet) || (!bGet && !bSet))
        {
            return(">>>> sorry >>>>");
        }

        var sb = new StringBuilder();

        if (bField || bProperty)
        {
            if (!bGenericT)
            {
                string strThis = typeFullName;
                if (!bStatic)
                {
                    strThis = "_this";
                    sb.AppendFormat("        {0} _this = ({0})vc.csObj;\n", typeFullName);
                }

                string result = string.Empty;
                if (bGet)
                {
                    // convention: name 'result'
                    result = "var result = ";
                }

                if (bIndexer)
                {
                    sb.AppendFormat("        {2}{0}[{1}]", strThis, argList, result);
                }
                else
                {
                    sb.AppendFormat("        {2}{0}.{1}", strThis, memberName, result);
                }

                if (bGet)
                {
                    sb.Append(";\n");
                }
                else
                {
                    sb.AppendFormat(" = {0};\n", newValue);
                    if (!bStatic && bStruct)
                    {
                        sb.Append("        JSMgr.changeJSObj(vc.jsObjID, _this);\n");
                    }
                }
            }
            else
            {
                // convention: name 'member'
                if (bIndexer || !bIndexer) // both indexer and not indexer enters
                {
                    if (bProperty)
                    {
                        sb.AppendFormat("        {4}member.{0}({1}, {2}new object[][[{3}]]);\n",
                                        bGet ? "GetValue" : "SetValue",
                                        bStatic ? "null" : "vc.csObj",
                                        bSet ? newValue + ", " : "",
                                        argList,
                                        bGet ? "var result = " : "");
                    }
                    else
                    {
                        sb.AppendFormat("        {3}member.{0}({1}{2});\n",
                                        bGet ? "GetValue" : "SetValue",
                                        bStatic ? "null" : "vc.csObj",
                                        bSet ? ", " + newValue : "",
                                        bGet ? "var result = " : "");
                    }
                }
            }
        }
        return(sb.ToString());
    }
예제 #3
0
        //
        // arg: a,b,c
        //
        public static TextFile BuildCallString(Type classType, MemberInfo memberInfo, string argList, MemberFeature features, object newValue = null /* string 或 TextFile */)
        {
            bool   bGenericT    = classType.IsGenericTypeDefinition;
            string memberName   = memberInfo.Name;
            bool   bIndexer     = ((features & MemberFeature.Indexer) > 0);
            bool   bStatic      = ((features & MemberFeature.Static) > 0);
            bool   bStruct      = classType.IsValueType;
            string typeFullName = JSNameMgr.CsFullName(classType);
            bool   bField       = (memberInfo is FieldInfo);
            bool   bProperty    = (memberInfo is PropertyInfo);
            bool   bGet         = ((features & MemberFeature.Get) > 0);
            bool   bSet         = ((features & MemberFeature.Set) > 0);

            if ((bGet && bSet) || (!bGet && !bSet))
            {
                return(null);
            }

            TextFile tf = new TextFile();

            if (bField || bProperty)
            {
                if (!bGenericT)
                {
                    var strThis = typeFullName;
                    if (!bStatic)
                    {
                        strThis = "_this";
                        tf.Add("{0} _this = ({0})vc.csObj;", typeFullName);
                    }

                    string access = bIndexer
                         ? string.Format("{0}[{1}]", strThis, argList)
                         : string.Format("{0}.{1}", strThis, memberName);

                    if (bGet)
                    {
                        tf.Add("var result = {0};", access);
                    }
                    else
                    {
                        if (newValue is string)
                        {
                            tf.Add("{0} = {1};", access, newValue);
                        }
                        else
                        {
                            tf.Add("{0} = ", access).In().Add((newValue as TextFile).Ch).Out().Add(";");
                        }

                        if (!bStatic && bStruct)
                        {
                            tf.Add("JSMgr.changeJSObj(vc.jsObjID, _this);");
                        }
                    }
                }
                else
                {
                    // convention: name 'member'
                    if (bIndexer || !bIndexer) // both indexer and not indexer enters
                    {
                        string objs = (bStatic ? "null" : "vc.csObj");
                        if (bProperty)
                        {
                            if (bGet)
                            {
                                tf.Add("var result = member.GetValue({0}, new object[]{{{1}}});",
                                       objs,
                                       argList);
                            }
                            else
                            {
                                if (newValue is string)
                                {
                                    tf.Add("member.SetValue({0}, {1}, new object[]{{{2}}});",
                                           objs,
                                           newValue,
                                           argList);
                                }
                                else
                                {
                                    tf.Add("member.SetValue({0}, ", objs)
                                    .In()
                                    .Add((newValue as TextFile).Ch)
                                    .Out()
                                    .Add(", new object[]{{{0}}});", argList);
                                }
                            }


                            //tf.Add("{4}member.{0}({1}, {2}new object[]{{{3}}});",
                            //    bGet ? "GetValue" : "SetValue",
                            //    bStatic ? "null" : "vc.csObj",
                            //    bSet ? newValue + ", " : "",
                            //    argList,
                            //    bGet ? "var result = " : "");
                        }
                        else
                        {
                            if (bGet)
                            {
                                tf.Add("var result = member.GetValue({0});", objs);
                            }
                            else
                            {
                                if (newValue is string)
                                {
                                    tf.Add("member.SetValue({0}, {1});", objs, newValue);
                                }
                                else
                                {
                                    tf.Add("member.SetValue({0}, ", objs).In().Add((newValue as TextFile).Ch).Out().Add(");");
                                }
                            }

                            //tf.Add("{3}member.{0}({1}{2});",
                            //    bGet ? "GetValue" : "SetValue",
                            //    bStatic ? "null" : "vc.csObj",
                            //    bSet ? ", " + newValue : "",
                            //    bGet ? "var result = " : "");
                        }
                    }
                }
            }
            return(tf);
        }