04.02.2013, 16:23 | #1 |
Участник
|
DataMembers для DataContract автоматически
Вот набросал простой скрипт, создающий методы аннотированные [DataMemberAttribute] для всех переменных класса:
X++: static void GenerateDataMembers(Args _args) { #define.classDeclaration('classDeclaration') str strAttributeMethodLine1 = '[DataMemberAttribute]\n'; str strAttributeMethodLine2 = 'public %1 parm%2(%1 _%2 = %2)\n'; str strAttributeMethodLine3 = '{\n'; str strAttributeMethodLine4 = '\t%2 = _%2;\n'; str strAttributeMethodline5 = '\treturn %2;\n'; str strAttributeMethodLine6 = '}'; str strAttributeMethod = strAttributeMethodLine1 + strAttributeMethodLine2 + strAttributeMethodLine3 + strAttributeMethodLine4 + strAttributeMethodLine5 + strAttributeMethodLine6; str lstrAttributeMethodSource; ClassId lclsClassId = classNum(<MyClassName>); //change this paramter SysDictClass lclsDictclass = new SysDictClass(lclsClassId); ClassBuild lclsClassBuild = new ClassBuild(lclsDictclass.name(), true); Set lsetMethods = lclsDictClass.methods(true, false, false); SetEnumerator lsenMethods = lsetMethods.getEnumerator(); Map lmapMethods = new Map(Types::String, Types::Class); MapEnumerator lmenMethods; SysDictMethod lclsMethod; str lstrClassDeclaration = lclsDictclass ? TreeNode::findNode(strFmt('\\Classes\\%1\\classDeclaration', lclsDictclass.name())).AOTgetSource() : ''; Map lmapMemberVariableParm = new Map(Types::String, Types::String); str lstrMemberVarPare; str lstrMemberVarType; str lstrMemberVarName; str lstrMemberVarMName; str lstrMemberVarPrefName; int lintStrLen, lintMemberVarStartPos, lintMemberVarEndPos; container lconMemberVars; int lintConLen, i; ; if (!lstrClassDeclaration) return; while (lsenMethods.moveNext()) { lclsMethod = lsenMethods.current(); lmapMethods.insert(lclsMethod.name(), lclsMethod); } lintStrLen = strLen(lstrClassDeclaration); lintMemberVarStartPos = strFind(lstrClassDeclaration, '{' ,1, lintStrLen); lintMemberVarEndPos = strFind(lstrClassDeclaration, '}',1, lintStrLen); lstrClassDeclaration = subStr( lstrClassDeclaration, lintMemberVarStartPos+1, lintMemberVarEndPos - lintMemberVarStartPos - 1); lstrClassDeclaration = strReplace(lstrClassDeclaration, '\n', ''); lstrClassDeclaration = strReplace(lstrClassDeclaration, '\t', ''); lstrClassDeclaration = strReplace(lstrClassDeclaration, ';', ','); lstrClassDeclaration = subStr(lstrClassDeclaration, 1, strLen(lstrClassDeclaration) - 1); lconMemberVars = str2con(lstrClassDeclaration); lintConLen = conLen(lconMemberVars); for (i = 1; i <= lintConLen; i++) { lstrMemberVarPare = conPeek(lconMemberVars, i); lstrMemberVarPare = strLRTrim(lstrMemberVarPare); lstrMemberVarType = subStr(lstrMemberVarPare, 1, strFind(lstrMemberVarPare, ' ', 1, strLen(lstrMemberVarPare))-1); lstrMemberVarName = strLTrim(subStr(lstrMemberVarPare, strLen(lstrMemberVarType) +1 , strLen(lstrMemberVarPare) - strLen(lstrMemberVarType))); if (! lmapMethods.exists('parm'+lstrMemberVarName)) { lstrAttributeMethodSource = strFmt(strAttributeMethod, lstrMemberVarType, lstrMemberVarName); lclsClassBuild.addMethod('parm' + lstrMemberVarName, lstrAttributeMethodSource); } } lclsClassBuild.classNode().AOTcompile(); } P.S. а то уже совсем надоело все это "руками" делать. Надеюсь еще кому-то пригодиться
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
|
За это сообщение автора поблагодарили: mazzy (2), trud (1), Logger (1), gl00mie (2). |
04.02.2013, 16:55 | #2 |
Участник
|
1. So drop the Hungarian
2. X++: lintMemberVarStartPos = strFind(lstrClassDeclaration, '{' ,1, lintStrLen); lintMemberVarEndPos = strFind(lstrClassDeclaration, '}',1, lintStrLen); lstrClassDeclaration = subStr( lstrClassDeclaration, lintMemberVarStartPos+1, lintMemberVarEndPos - lintMemberVarStartPos - 1); X++: System.Text.RegularExpression.Regex::replace(@'^.*\{(.*)\}.*$','$1') |
|
|
За это сообщение автора поблагодарили: mazzy (2), gl00mie (2). |
04.02.2013, 17:43 | #3 |
Участник
|
1. Ну это такие требования у нас на проекте - я их тоже не любил, но ИМХО при автоподстановке в AX2012 очень удобно
2. А это Вы к чему? Я собственно собирался середину выудить, там мне заменять только потом надо было.
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
05.02.2013, 09:50 | #4 |
Участник
|
1. Приношу свои соболезнования
2. Это и есть выудить середину - только короче |
|
05.02.2013, 09:56 | #5 |
Участник
|
Это, наверно, к тому, что при наличии строк вида
X++: MyType myVar; Код: ^\s*(\w+)\s+(\w+);.* Код: [DataMemberAttribute]\npublic $1 parm\u$2($1 _$2 = $2)\n{\n $2 = _$2;\n return $2;\n} |
|
|
За это сообщение автора поблагодарили: plumbum (1). |
05.02.2013, 10:25 | #6 |
Участник
|
Не - тут просто заменой не обойтись - надо же еще удалить чего-то там. Я бы просто прошелся по матчам этого регекспа и сформировал код методов при помощи
X++: strFmt(@'
%1 parm%2(%1 _value=%3)
{
%3 = _value;
return %3;
}
', type, upperCaseName, lowerCaseName); |
|
05.02.2013, 19:04 | #7 |
Участник
|
Понял насчет регулярных выражений, не обратил внимание на то, что под $* имелись в виду параметры - извиняюсь.
В дополнение еще, конечно, надо было бы вставить код, выуживающий комментарии и макросы из classDeclaration. Ну что ж, в следующем релизе Собственно код метода и формируется с помощью strFmt.
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
06.02.2013, 09:58 | #8 |
Участник
|
Если взять ScannerClass то комментарии макросы и прочее оно учтёт само.
Поит был не в strFmt а в использовании многострочных строк и в матчах регекспов |
|
06.02.2013, 17:31 | #9 |
Участник
|
в приведенной ссылке
Цитата:
Если взять ScannerClass
http://erpkb.com/Axapta/Klass/ParserClass?v=1cfk а в ней ссылка (Перед чтением этой статьи рекомендуется изучить БНФ грамматику X++ ) http://msdn.microsoft.com/library/en...X++grammar.asp ссылка не рабочая... можете указать рабочую ссылку на msdn? Последний раз редактировалось Evgeniy2020; 06.02.2013 в 17:34. |
|
06.02.2013, 19:11 | #10 |
Участник
|
Цитата:
Сообщение от Evgeniy2020
в приведенной ссылке на сайте http://erpkb.com/Axapta/Klass/ScannerClass указана ссылка [...]ссылка не рабочая... можете указать рабочую ссылку на msdn?
|
|
06.02.2013, 21:07 | #11 |
Участник
|
|
|
06.02.2013, 23:19 | #12 |
Участник
|
Кстати, code upgrade tool содержит в себе парзер X++ на C#
|
|
Теги |
ax2012, datamemberattribute, sysoperation framework |
|
|