5

つまり、次のような方法があります。

public static int CreateTaskGroup(string TaskGroupName, 
    string Market = "en-us", string Project = "MyProject", 
    string Team = "DefaultTeam", string SatelliteID="abc");

コマンドライン引数の標準配列を読み取ることにより、コマンドラインからこのメソッドを呼び出したいと思います。それを行うための明白な方法は次のとおりです。

 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]);

これをより簡潔な方法で行うことは可能ですか?

4

5 に答える 5

4

デフォルト値の定数を再宣言する必要があるという欠点があります。

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());

これは少し読みにくいかもしれませんし、速すぎることもありませんが、繰り返しのコードに頼ったり、パラメーターのデフォルト値について不確実性を感じたりすることなく、要求どおりに実行されます。パラメータが少なすぎたり多すぎたりする場合は、エラー処理を追加する必要があります。私はこの解決策を好みます。

于 2012-06-21T23:40:05.783 に答える
2

これは、物事をきれいに保ち、デフォルト値を知る責任を TaskGroupCreator に割り当てるためにクラスを実装する方法です。

public class TaskGroupCreator
{
    private string[] values;

    public TaskGroupCreator(string[] values)
    {
        this.values = values;
    }

    public string TaskGroupName
    {
        get { return values[0]; }
    }

    public string Market
    {
        get { return this.GetElement(1, "en-us"); }
    }

    public string Project 
    {
        get { return this.GetElement(2, "MyProject"); }
    }

    public string Team 
    {
        get { return this.GetElement(3, "DefaultTeam"); }
    }

    public string SatelliteID 
    {
        get { return this.GetElement(4, "abc"); }
    }

    public int CreateTaskGroup()
    {
        // Do stuff with your properties...
    }

    private string GetElement(int index, string defaultValue)
    {
        return this.values.ElementAtOrDefault(index) ?? defaultValue;
    }
}

使用法:

var taskGroup = new TaskGroupCreator(args).CreateTaskGroup();
于 2012-06-21T23:50:34.583 に答える
2

このようなCreateTaskGroupでparamsを使用するのはどうですか

 public static int CreateTaskGroup(params string[] args) 
 {
    for ( int i = 0 ; i < args.Length ; i++ )
    {
      ............
于 2012-06-21T23:40:48.047 に答える
0

私ならこうします..

CreateTaskGroup(args);

//.....

public static int CreateTaskGroup(params string[] args) {
    if (args.Length == 0) throw new Exception("nope!");
    args = args.Concat(Enumerable.Range(0, 5 - args.Length)
        .Select<int, string>(_ => null)).ToArray();
    string TaskGroupName = args[0];
    string Market = args[1] ?? "en-us";
    string Project = args[2] ?? "MyProject";
    string Team = args[3] ?? "DefaultTeam";
    string SatelliteID = args[4] ?? "abc";
    //......
}

paramsキーワードは必須ではありませんが、便利な場合があります...

于 2012-06-21T23:55:19.737 に答える
0

これはおそらく私が思いついたものの中で最高です:

public static int CreateTaskGroup(string[] arguments)
{
    // optional error handling here

    string TaskGroupName = arguments[0];
    string Market        = arguments.ElementAtOrDefault(1) ?? "en-us";
    string Project       = arguments.ElementAtOrDefault(2) ?? "MyProject";
    string Team          = arguments.ElementAtOrDefault(3) ?? "DefaultTeam";
    string SatelliteID   = arguments.ElementAtOrDefault(4) ?? "abc";

    // function body as it was

これは同じことを行いますが、簡潔ではありません。

public static int CreateTaskGroup(string[] arguments)
{
    string TaskGroupName, Market, Project, Team, SatelliteID;
    switch (arguments.Length)
    {
    case 5:
        string SatelliteID   = arguments[4] ?? "abc";
        goto case 4;
    case 4:
        string Team          = arguments[3] ?? "DefaultTeam";
        goto case 3;
    case 3:
        string Project       = arguments[2] ?? "MyProject";
        goto case 2;
    case 2:
        string Market        = arguments[1] ?? "en-us";
        goto case 1;
    case 1:
        string TaskGroupName = arguments[0];
        break;
    case 0:
        // error handling here;
    }

    // function body as it was

次のように簡潔に呼び出すことができます。

CreateTaskGroup(args);
于 2012-06-21T23:42:20.073 に答える