如果您不介意进行一些重组,这里有一个比序列化 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));
}
}
如果你像这样制作你的工厂,你的 switch 语句可以被一个简单的调用替换,BuildActionFactory.CreateBuildAction("BUILDTEST/CHANGEROLE/CHECKOUTDATA/etc whatever you got from the user").PerformBuildAction()
然后你的自述文件内容可以由BuildActionFactory.BuildReadme()
. 当然,如果您希望在构建解决方案时构建自述文件,则需要添加一个BuildActionFactory.BuildReadme()
从包装控制台应用程序项目调用的构建后任务,但这比重构以读取配置文件更简单,您可以从中生成自述文件。
免责声明:以上所有代码都是用 Sublime 编写的。它都没有被编译或测试过,但它应该让你知道如果你采用这种方法该怎么做。