WinForm开发的小技巧(2)——命令行
2018-08-08 本文已影响43人
冰麟轻武
一、
winform开发或控制台开发的时候,我们经常希望自己的程序可以留一些小“后门”
或方便调试,或特殊需求,或仅为了好玩;
比如
我做了一个扫码登录的功能,但是处于测试状态,通过命令行打开此功能
二、
可能大家会觉得很简单Environment.GetCommandLineArgs().Contains("--debug")
不就行了吗?
但是如果增加一个功能,比如这样
所以我写了一个解析命令行的类
三、
StartupCommands
static class StartupCommands
{
static StartupCommands()
{
try
{
var args = Environment.GetCommandLineArgs().Skip(1).ToArray(); // 去掉命令行第一个命令
foreach (var prop in typeof(StartupCommands).GetProperties())
{
// 循环当前类的属性, 优先获取 --{属性全名,不区分大小写} 如 --loginname
// 如果没有取到, 再次获取 -{短命令} 如 -n
var arg = args.FirstOrDefault(x => x.StartsWith($"--{prop.Name}", StringComparison.OrdinalIgnoreCase))
?? (Attribute.GetCustomAttribute(prop, typeof(ShortAttribute)) is ShortAttribute attr
? args.FirstOrDefault(x => x.StartsWith($"-{attr.Command}", StringComparison.Ordinal))
: null);
if (arg == null) // 都没取到则忽略
{
continue;
}
// 获取命令 冒号(:) 之后的内容, 当做属性值, 如果不存在冒号
// 默认值为true , 如: --debug 等于 --debug:true
var val = arg.Split(':').ElementAtOrDefault(1)?.Trim() ?? "true";
// 转换类型并设置到属性
prop.SetValue(null, Convert.ChangeType(val, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType));
}
}
catch (Exception ex)
{
System.Diagnostics.Trace.TraceError("SuperAddon初始化 异常", ex);
throw new NotSupportedException("启动参数有误", ex);
}
}
/// <summary>
/// 短命令
/// </summary>
[AttributeUsage(AttributeTargets.Property)]
sealed class ShortAttribute : Attribute
{
public ShortAttribute(string command) => Command = command;
public string Command { get; }
}
[Short("n")]
public static string LoginName { get; private set; }
[Short("p")]
public static string Password { get; private set; }
[Short("d")]
public static bool? Debug { get; private set; }
public static bool? AutoLogin { get; private set; }
}
基本规则是 --完整指令名[:值]
或 -短指令[:值]
完整指令名匹配 类中的属性名称(不区分大小写)
短指令通过ShortAttribute
来指定(区分大小写)
值不存在时默认为 true
四、
这样用
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
if (StartupCommands.Debug == true)
{
pictureBox2.Visible = true;
}
textBox1.Text = StartupCommands.LoginName;
textBox2.Text = StartupCommands.Password;
}
protected override void OnShown(EventArgs e)
{
if (StartupCommands.AutoLogin == true)
{
button1.PerformClick();
}
base.OnShown(e);
}
private void pictureBox2_Click(object sender, EventArgs e)
{
groupBox1.Visible = false;
pictureBox1.Visible = false;
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("登录成功");
}
}
五、
嗯。。。就这么点。。。
如果文章可以帮到你,别忘了帮我点一下喜欢,让更多的人看到