美文网首页
Python杂文——CShap脚本生成辅助工具

Python杂文——CShap脚本生成辅助工具

作者: 脸白 | 来源:发表于2023-10-04 01:45 被阅读0次

    原文地址

    简介

    本文介绍了一个用于辅助生成C#脚本的Python工具。该工具可以帮助用户快速生成C#脚本,并提供了一些常用的代码生成方法。

    代码

    import os
    
    from PathUtil import ScriptsPath
    
    
    class CSScriptBuilder(list):
        BlackNum = 0
    
        def Append(self, message):
            if self.BlackNum > 0:
                self.append('\t' * self.BlackNum + message)
            else:
                self.append(message)
    
        def AppendEnter(self):
            self.Append('\n')
    
        def AppendLine(self, message):
            if len(self) > 0:
                self.append('\n')
            if self.BlackNum > 0:
                self.append('\t' * self.BlackNum + message)
            else:
                self.append(message)
    
        def AppendEmptyLine(self):
            self.AppendLine('')
    
        def AppendUsing(self, namespace):
            self.AppendLine(f'using {namespace};')
    
        def BeginNamespace(self, namespace):
            self.AppendLine(f'namespace {namespace}')
            self.BeginBrace()
    
        def EndNamespace(self):
            self.EndBrace()
    
        def BeginClass(self, className, modifier="public", superclass=None):
            if superclass is not None:
                self.AppendLine(f'{modifier} class {className} : {superclass}')
            else:
                self.AppendLine(f'{modifier} class {className}')
            self.BeginBrace()
    
        def EndClass(self):
            self.EndBrace()
    
        def BeginStruct(self, structName, modifier="public"):
            self.AppendLine(f'{modifier} struct {structName}')
            self.BeginBrace()
    
        def EndStruct(self):
            self.EndBrace()
    
        def BeginEnum(self, enumName, modifier="public"):
            self.AppendLine(f'{modifier} enum {enumName}')
            self.BeginBrace()
    
        def EndEnum(self):
            self.EndBrace()
    
        def AppendEnumField(self, fieldName, fieldValue):
            self.AppendLine(f'{fieldName} = {fieldValue},')
    
        def BeginInterface(self, interfaceName, modifier="public"):
            self.AppendLine(f'{modifier} interface {interfaceName}')
            self.BeginBrace()
    
        def EndInterface(self):
            self.EndBrace()
    
        def AppendInterfaceMethod(self, methodName, returnType='void', parameters=''):
            self.AppendLine(f'{returnType} {methodName}({parameters});')
    
        def AppendField(self, propertyName, propertyType, modifier="public", init=''):
            if len(init) > 0:
                self.AppendLine(f'{modifier} {propertyType} {propertyName} = {init};')
            else:
                self.AppendLine(f'{modifier} {propertyType} {propertyName};')
    
        def AppendProperty(self, propertyName, propertyType, field=None, modifier="public"):
            if field is not None:
                self.AppendLine(f'{modifier} {propertyType} {propertyName} => {field};')
            else:
                self.AppendLine(f'{modifier} {propertyType} {propertyName} {{ get; set; }}')
    
        def BeginProperty(self, propertyName, propertyType, modifier="public"):
            self.AppendLine(f'{modifier} {propertyType} {propertyName}')
            self.BeginBrace()
    
        def EndProperty(self):
            self.EndBrace()
    
        def BeginMethod(self, methodName, modifier="public", returnType='void', parameters=''):
            self.AppendLine(f'{modifier} {returnType} {methodName}({parameters})')
            self.BeginBrace()
    
        def BeginConstructionMethod(self, methodName, modifier="public", parameters=''):
            self.AppendLine(f'{modifier} {methodName}({parameters})')
            self.BeginBrace()
    
        def EndMethod(self):
            self.EndBrace()
    
        def BeginIf(self, condition):
            self.AppendLine(f'if ({condition})')
            self.BeginBrace()
    
        def BeginElif(self, condition):
            self.AppendLine(f'else if ({condition})')
            self.BeginBrace()
    
        def EndIf(self):
            self.EndBrace()
    
        def BeginWhile(self, condition):
            self.AppendLine(f'while ({condition})')
            self.BeginBrace()
    
        def EndWhile(self):
            self.EndBrace()
    
        def BeginTry(self):
            self.AppendLine('try')
            self.BeginBrace()
    
        def EndTry(self):
            self.EndBrace()
    
        def BeginCatch(self, exceptionType):
            self.AppendLine(f'catch ({exceptionType})')
            self.BeginBrace()
    
        def BeginForEach(self, name, collection, singleType='var'):
            self.AppendLine(f'foreach ({singleType} {name} in {collection})')
            self.BeginBrace()
    
        def EndForEach(self):
            self.EndBrace()
    
        def BeginFor(self, condition):
            self.AppendLine(f'for ({condition})')
            self.BeginBrace()
    
        def EndFor(self):
            self.EndBrace()
    
        def BeginForRange(self, name, start, end):
            self.AppendLine(f'for (int {name} = {start}; {name} < {end}; {name}++)')
            self.BeginBrace()
    
        def EndForRange(self):
            self.EndBrace()
    
        def EndCatch(self):
            self.EndBrace()
    
        def BeginBlank(self):
            self.BlackNum += 1
    
        def EndBlank(self):
            self.BlackNum -= 1
    
        def BeginBrace(self):
            self.AppendLine('{')
            self.BeginBlank()
    
        def EndBrace(self):
            self.EndBlank()
            self.AppendLine('}')
    
        def BeginRegion(self, regionName):
            self.AppendLine(f'#region {regionName}')
            self.AppendEmptyLine()
    
        def EndRegion(self):
            self.AppendEmptyLine()
            self.AppendLine('#endregion')
            self.AppendEmptyLine()
    
        def ToString(self):
            return ''.join(self)
    
        def GenerateScript(self, fileName, isDefPath=True):
            fileName = fileName.replace('.cs', '')
            if isDefPath:
                fileName = os.path.join(ScriptsPath, fileName)
            with open(f'{fileName}.cs', 'w', encoding='utf-8') as f:
                f.write(self.ToString())
    

    示例

    def CreateTableManagerCs():
        script = CSScriptBuilder()
        script.AppendUsing('System.Collections.Generic')
        script.AppendUsing('UnityEngine')
        script.BeginNamespace(TableLoadAssembly)
        script.BeginInterface('ITable', 'public')
        script.AppendInterfaceMethod('Dispose')
        script.EndInterface()
        script.AppendEmptyLine()
        script.BeginClass('TableManager', 'public static')
        script.AppendField('s_Inited', 'bool', 'private static')
        script.AppendField('s_Cached', 'List<ITable>', 'private static', 'new List<ITable>()')
        # 添加方法
        script.AppendEmptyLine()
        script.BeginMethod("Add", parameters="ITable table")
        script.AppendLine("Debug.Assert(s_Inited, \"add but TableManager not init \");")
        script.AppendLine("s_Cached.Add(table);")
        script.EndMethod()
        script.AppendEmptyLine()
        script.BeginMethod("Remove", parameters="ITable table")
        script.AppendLine("Debug.Assert(s_Inited, \"remove but TableManager not init\");")
        script.AppendLine("if (s_Cached.Remove(table))")
        script.BeginBrace()
        script.AppendLine("table.Dispose();")
        script.EndBrace()
        script.EndMethod()
        script.AppendEmptyLine()
        script.BeginMethod("Init")
        script.AppendLine("Debug.Assert(!s_Inited, \"TableManager already init\");")
        script.AppendLine("s_Inited = true;")
        script.EndMethod()
        script.AppendEmptyLine()
        script.BeginMethod("UnInit")
        script.AppendLine("Debug.Assert(s_Inited, \"TableManager not init\");")
        script.AppendLine("s_Inited = false;")
        script.AppendLine("foreach (var table in s_Cached)")
        script.BeginBrace()
        script.AppendLine("table.Dispose();")
        script.EndBrace()
        script.AppendLine("s_Cached.Clear();")
        script.EndMethod()
        script.EndClass()
        script.EndNamespace()
        script.GenerateScript(os.path.join(ScriptsPath, 'TableManager'))
    

    总结

    以上是本文介绍的C#脚本生成辅助工具的代码示例。工具的核心是一个名为CSScriptBuilder的类,它继承自list,并提供了一系列用于生成C#脚本的方法。

    通过使用这个工具,用户可以更加方便地生成C#脚本,提高开发效率。

    希望本文对您理解这个工具的用途和使用方法有所帮助。如果您有任何问题或建议,欢迎留言讨论。

    相关文章

      网友评论

          本文标题:Python杂文——CShap脚本生成辅助工具

          本文链接:https://www.haomeiwen.com/subject/kqjkbdtx.html