我可以修改参数数组的内容吗?

Can I modify the contents of a params array?

我有很多方法可以将值替换为参数化的 URL 并将此 URL 称为 WebRequest。我把它拉进了一个实用方法

public string BuildMethodCall(string MethodName, params object[] Args)
{
 ... //stuff
 String.Format(something, Args);
}

但我需要确保所有 DateTime 对象都以某种方式格式化。为了避免我在每个调用方法中都这样做,我可以让 BuildMethodCall 以某种方式修改 params 元素,以便每个 DateTime dt 替换为 dt.ToString(format)?

params-array 和其他数组一样只是一个普通的数组。您可以根据需要修改它的条目,但当然 不是 它的引用(因为它不是 outref)。

public string BuildMethodCall(string MethodName, params object[] Args)
{
    ... //stuff
    args[0] = String.Format(something, args[0]);
}

现在在您的调用代码中使用新值:

@params = BuildMethodCall("DoSomething", @params);
foreach(var p in @params) 
{
    var dt = p as DateTime?;
    if(dt != null) ...
}

您甚至可以在您的方法中重新引用该变量:

public string BuildMethodCall(string MethodName, params object[] Args)
{
    ... //stuff
    args = // do something
}

但是这对调用代码没有任何影响。

编辑:虽然上面的方法有效,但改变已经引入的变量的语义并不是最好的主意。您应该考虑只添加一个作为 out 传递的数组,其中包含实际的 DateTime-实例并保持输入值不变。

而不是使用原始数组来尝试以下方法怎么样?

public string BuildMethodCall(string MethodName, params object[] Args)
{
    var newArgs = Args.Select(arg => arg is DateTime ? arg.ToString() : arg).ToArray();
    // New array has original arguments with date time arguments string formatted...
}

是的,您可以更改内容,但这可能会产生副作用 更好的方法是使用第二个数组。 代码可能如下所示:

public string BuildMethodCall(string MethodName, params object[] Args)
{
  object[] tmpArgs = new object[Args.Length];
  for (int i = 0; i < Args.Length; i++)
  {
    if (Args[i].GetType() == typeof(DateTime))
    {
      tmpArgs[i] = ((DateTime)Args[i]).ToString();
    }
    else
      tmpArgs[i] = Args[i];
  }
  String.Format(something, tmpArgs);
}