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

时间:2017-01-10 13:15:03

标签: c# .net .net-4.0

我有一堆方法可以将值替换为参数化的URL,并将此URL称为WebRequest。我将其拉入实用方法

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

但我需要确保所有DateTime个对象都以某种方式格式化。为了节省我在每个调用方法中执行此操作,我可以BuildMethodCall以某种方式修改params元素,以便每个DateTime dt替换为dt.ToString(format)吗?

3 个答案:

答案 0 :(得分:3)

params - 数组也是一个常见的数组。您可以根据需要修改它的条目,但当然它的引用(因为它不是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 - 实例,并保持输入值不变。

答案 1 :(得分:0)

而不是使用原始数组的猴子如何尝试以下内容?

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...
}

答案 2 :(得分:0)

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

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