デフォルト値の定数を再宣言する必要があるという欠点があります。
CreateTaskGroup(
args[0],
args.ElementAtOrDefault(1) ?? "en-us",
args.ElementAtOrDefault(2) ?? "MyProject",
args.ElementAtOrDefault(3) ?? "DefaultTeam",
args.ElementAtOrDefault(4) ?? "abc");
const
文字列をsとして宣言することで、この問題を減らすことができます。
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());
これは少し読みにくいかもしれませんし、速すぎることもありませんが、繰り返しのコードに頼ったり、パラメーターのデフォルト値について不確実性を感じたりすることなく、要求どおりに実行されます。パラメータが少なすぎたり多すぎたりする場合は、エラー処理を追加する必要があります。私はこの解決策を好みます。