也就是说,我有一个如下方法:
public static int CreateTaskGroup(string TaskGroupName,
string Market = "en-us", string Project = "MyProject",
string Team = "DefaultTeam", string SatelliteID="abc");
Run Code Online (Sandbox Code Playgroud)
我想通过读取标准的命令行参数数组从命令行调用此方法.显而易见的方法如下:
if (args.Length == 1) CreateTaskGroup(args[0]);
if (args.Length == 2) CreateTaskGroup(args[0], args[1]);
if (args.Length == 3) CreateTaskGroup(args[0], args[1], args[2]);
Run Code Online (Sandbox Code Playgroud)
是否有可能以更简洁的方式做到这一点?
这是一个替代方案,您必须重新声明默认值常量:
CreateTaskGroup(
args[0],
args.ElementAtOrDefault(1) ?? "en-us",
args.ElementAtOrDefault(2) ?? "MyProject",
args.ElementAtOrDefault(3) ?? "DefaultTeam",
args.ElementAtOrDefault(4) ?? "abc");
Run Code Online (Sandbox Code Playgroud)
您可以通过将字符串声明为consts 来减少此问题,例如:
public const string MarketDefault = "en-us";
public static int CreateTaskGroup(string TaskGroupName,
string Market = MarketDefault, ...)
static void Main(string[] args)
{
CreateTaskGroup(
args[0],
args.ElementAtOrDefault(1) ?? MarketDefault,
...);
}
Run Code Online (Sandbox Code Playgroud)
但是,编译器并不能保证它,也不MarketDefault是显而易见的,实际上,它仍然是(代码可以在将来重构)的默认值Market.
编辑:这是一个替代解决方案,使用反射:
var argsForMethod = new List<string>(args);
var m = typeof(Program).GetMethod("CreateTaskGroup");
foreach (var p in m.GetParameters().Skip(args.Length))
if (p.Attributes.HasFlag(ParameterAttributes.HasDefault))
argsForMethod.Add((string)p.DefaultValue);
else
throw new NotImplementedException();
var result = (int)m.Invoke(null, argsForMethod.ToArray());
Run Code Online (Sandbox Code Playgroud)
这可能有点难以阅读,并且不会太快,但它会按照您的要求进行操作,而无需使用重复代码,或者对参数的默认值有任何不确定性.您可能希望为太少或太多的参数添加一些错误处理.我更喜欢这个解决方案
| 归档时间: |
|
| 查看次数: |
234 次 |
| 最近记录: |