.NET Core 依賴注入改造(2)- 委托轉(zhuǎn)換
一、
winform開發(fā)或控制臺開發(fā)的時候,我們經(jīng)常希望自己的程序可以留一些小“后門”
或方便調(diào)試掠河,或特殊需求颠印,或僅為了好玩瘤载;
比如
我做了一個掃碼登錄的功能信夫,但是處于測試狀態(tài)扁位,通過命令行打開此功能
二塞栅、
可能大家會覺得很簡單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())
{
// 循環(huán)當前類的屬性, 優(yōu)先獲取 --{屬性全名,不區(qū)分大小寫} 如 --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;
}
// 獲取命令 冒號(:) 之后的內(nèi)容, 當做屬性值, 如果不存在冒號
// 默認值為true , 如: --debug 等于 --debug:true
var val = arg.Split(':').ElementAtOrDefault(1)?.Trim() ?? "true";
// 轉(zhuǎn)換類型并設(shè)置到屬性
prop.SetValue(null, Convert.ChangeType(val, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType));
}
}
catch (Exception ex)
{
System.Diagnostics.Trace.TraceError("SuperAddon初始化 異常", ex);
throw new NotSupportedException("啟動參數(shù)有誤", 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; }
}
基本規(guī)則是 --完整指令名[:值]
或 -短指令[:值]
完整指令名匹配 類中的屬性名稱(不區(qū)分大小寫)
短指令通過ShortAttribute
來指定(區(qū)分大小寫)
值不存在時默認為 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("登錄成功");
}
}
五、
嗯砾医。拿撩。。就這么點如蚜。压恒。影暴。
如果文章可以幫到你,別忘了幫我點一下喜歡探赫,讓更多的人看到