是否可以爆炸数组,以便可以使用params关键字将其元素传递给方法?

Ric*_*ich 5 c# parameters params-keyword variadic-functions keyword

以这个非编译代码为例:

public string GetPath(string basefolder, string[] extraFolders)
{
    string version = Versioner.GetBuildAndDotNetVersions();
    string callingModule = StackCrawler.GetCallingModuleName();
    return AppendFolders(basefolder, version, callingModule, extraFolders);
}
private string AppendFolders(params string[] folders)
{
    string outstring = folders[0];
    for (int i = 1; i < folders.Length; i++)
    {
        string fixedPath = folders[i][0] == '\\' ? folders[i].Substring(1) : folders[i];
        Path.Combine(outstring, fixedPath);
    }
    return outstring;
}
Run Code Online (Sandbox Code Playgroud)

这个例子是我正在使用的测试代码的简化版本.请,我只对直接与param关键字有关的解决方案感兴趣.我知道列表和其他类似的东西是如何工作的.

有没有办法"爆炸"extraFolders数组,以便它的内容可以与其他参数一起传递到AppendFolders?

Jam*_*ran 7

只是通过它.folders参数首先是一个数组."params"功能是一点编译魔术,但它不是必需的.

AppendFolders(extraFolders);
Run Code Online (Sandbox Code Playgroud)

现在,就这个特殊情况而言,你必须首先向该数组添加一些东西.

List<string> lstFolders = new List<string>(extraFolders);
lstFolder.Insert(0, callingModule);
lstFolder.Insert(0, version);
lstFolder.Insert(0, basefolder);
return AppendFolders(lstFolders.ToArray());
Run Code Online (Sandbox Code Playgroud)


Mar*_*ade 1

一种选择是将params参数设置为object[]

static string appendFolders(params object[] folders)
 { return (string) folders.Aggregate("",(output, f) => 
                       Path.Combine( (string)output
                                    ,(f is string[]) 
                                      ? appendFolders((object[])f)
                                      : ((string)f).TrimStart('\\')));
 }
Run Code Online (Sandbox Code Playgroud)

如果您想要更强类型的东西,另一个选择是使用隐式转换运算符创建自定义联合类型:

  static string appendFolders(params StringOrArray[] folders)
     { return folders.SelectMany(x=>x.AsEnumerable())
                     .Aggregate("",
                       (output, f)=>Path.Combine(output,f.TrimStart('\\')));
     }

   class StringOrArray
     { string[] array;

       public IEnumerable<string> AsEnumerable()
        { return soa.array;}

       public static implicit operator StringOrArray(string   s)   
        { return new StringOrArray{array=new[]{s}};}

       public static implicit operator StringOrArray(string[] s)  
        { return new StringOrArray{array=s};}
     }
Run Code Online (Sandbox Code Playgroud)

无论哪种情况,都编译:

appendFolders("base", "v1", "module", new[]{"debug","bin"});
Run Code Online (Sandbox Code Playgroud)