繁体   English   中英

序列化c#使用开关来序列化自述文件

[英]Serializing c# use switch to serialize a Readme

我开发了一个应用程序,它在内部向组织内的其他开发人员提供回归测试功能,并且他们通过应用程序前端接口的主要方式是通过硬编码字符串,这些字符串对应于代码中的switch case结构,如:

           case "BUILDTEST":
                //Build the test with the supplied designator as 'arg_designator'
                returnVal = BuildDesignator();
                break;

            case "CHANGEROLE":
                //Changes the user's role
                returnVal = ChangeRole();
                break;

            case "CHECKOUTDATA":
                //Check out the data you wish to test
                returnVal = CheckoutRoute();
                break;

序列化案例下面的名称和注释以在每次构建时生成某种自述文件的最佳方法是什么? 在这个例子中,我想生成一个看起来像这样的文件:

FUNCTIONALITY

BUILDTEST: Build the test with the supplied designator as 'arg_designator'

CHANGEROLE: Changes the user's role

CHECKOUTDATA: Check out the data you wish to test

感谢您提供的任何帮助

如果您不介意进行一些重组,这里有一个比序列化switch语句内容更好的解决方案。 我非常怀疑你想在该源上运行正则表达式查找/替换操作,或者添加文件来帮助导出交换机内容。

首先,确保每个构建操作类都继承自基类。 在执行此操作时,请为每个构建操作类提供描述以使事情更容易:

public abstract class BuildAction
{
    public string Description { get; set; }

    protected BuildAction(string description)
    {
        Description = description;
    }

    public abstract void PerformBuildAction();
}

public class BuildTest : BuildAction
{
    public BuildTest() : base("Build the test with the supplied designator as 'arg_designator'") { }

    public override void PerformBuildAction() 
    {
        // do stuff here
    }
}

public class ChangeRole : BuildAction
{
    public ChangeRole() : base("Change the user's role") { }

    public override void PerformBuildAction()
    {
        // do stuff here
    }
}

public class CheckoutData : BuildAction
{
    public CheckoutData : base("Check out the data you wish to test") { }

    public override void PerformBuildAction()
    {
        // do stuff here
    }
}

之后,您可以删除switch语句并将其替换为通用工厂。 根据您的工厂制作方式,您可以通过首先构建一个目录来迭代自述文件并简化命令路由的查找,从而利用它来生成自述文件:

public class BuildActionFactory
{
    private static IDictionary<string, BuildAction> _buildActions =
        new Dictionary<string, BuildAction>()
        {
            {"BUILDTEST", typeof(BuildTest)},
            {"CHANGEROLE", typeof(ChangeRole)},
            {"CHECKOUTDATA", typeof(CheckoutData)}
        };

    public static BuildAction CreateBuildAction(string directive)
    {
        return _buildActions.ContainsKey(directive) ?
            Activator.CreateInstance(_buildActions[directive]) :
            null;
    }

    public static string BuildReadme()
    {
        return string.Join(Environment.NewLine + Environment.NewLine,
            new [] {"FUNCTIONALITY"}.Union(_buildActions.Select(pair => pair.Key + ": " + pair.Value.Description));
    }
}

如果您使用这样的工厂,可以通过简单调用BuildActionFactory.CreateBuildAction("BUILDTEST/CHANGEROLE/CHECKOUTDATA/etc whatever you got from the user").PerformBuildAction()来替换您的switch语句BuildActionFactory.CreateBuildAction("BUILDTEST/CHANGEROLE/CHECKOUTDATA/etc whatever you got from the user").PerformBuildAction()然后您的自述文件内容可以是由BuildActionFactory.BuildReadme()生成。 当然,如果您希望在构建解决方案时构建自述文件,则需要添加一个从BuildActionFactory.BuildReadme()器控制台应用程序项目调用BuildActionFactory.BuildReadme()构建后任务,但这比重构读取您可以生成的配置文件更简单来自的自述文件。

免责声明:以上所有代码均以Sublime编写。 它们都没有经过编译或测试,但它应该让您知道如果采用这种方法该怎么做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM