这是一种替代方法,缺点是您必须重新声明默认值常量:
CreateTaskGroup(
args[0],
args.ElementAtOrDefault(1) ?? "en-us",
args.ElementAtOrDefault(2) ?? "MyProject",
args.ElementAtOrDefault(3) ?? "DefaultTeam",
args.ElementAtOrDefault(4) ?? "abc");
您可以通过将字符串声明为 s 来减少此问题const
,例如:
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,
...);
}
但是编译器并不能保证,也不是很明显,也就是说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());
这可能有点难以阅读,并且不会太快,但是它可以满足您的要求,而无需使用重复的代码,也不会对参数的默认值有任何不确定性。您可能希望为太少或太多的参数添加一些错误处理。我更喜欢这个解决方案。