在C#中,是否可以使用"尽可能多的参数"调用方法(具有默认参数)?

mer*_*011 5 .net c# c#-4.0

也就是说,我有一个如下方法:

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)

是否有可能以更简洁的方式做到这一点?

Tim*_* S. 5

这是一个替代方案,您必须重新声明默认值常量:

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)

这可能有点难以阅读,并且不会太快,但它会按照您的要求进行操作,而无需使用重复代码,或者对参数的默认值有任何不确定性.您可能希望为太少或太多的参数添加一些错误处理.我更喜欢这个解决方案