Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以修改参数数组的内容吗?_C#_.net_.net 4.0 - Fatal编程技术网

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

C# 我可以修改参数数组的内容吗?,c#,.net,.net-4.0,C#,.net,.net 4.0,我有一系列方法将值替换为参数化URL,并将此URL称为WebRequest。我把它变成了一个实用的方法 public string BuildMethodCall(string MethodName, params object[] Args) { ... //stuff String.Format(something, Args); } 但我需要确保所有DateTime对象都以某种方式格式化。为了避免我在每个调用方法中这样做,我可以让BuildMethodCall以某种方式修改param

我有一系列方法将值替换为参数化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
-数组和其他数组一样只是一个常用数组。您可以根据需要修改它的条目,但当然不能修改它的引用(因为它没有被标记为
out
ref

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

@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
}
但是,这对调用代码没有任何影响


编辑:尽管上述方法可行,但改变已经引入的变量的语义并不是最好的方法。您应该考虑只添加一个数组,作为<代码>输出> /COD>,包含实际的<代码> DATETIME/<代码>实例,并保持输入值不变。

< P>而不是使用原始数组的猴子。
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);
}
公共字符串BuildMethodCall(字符串方法名,参数对象[]Args)
{
object[]tmpArgs=新对象[Args.Length];
for(int i=0;i
您可以尝试一下,看看会发生什么。或者您可以从params参数中投影一个新数组,并保留原始数组不变。也许您可以在每个请求中使用一个拦截器为您这样做?实际尝试似乎不费吹灰之力。为什么不写两行代码来测试这个呢?在这个方法中,params数组并没有什么神奇之处,它只是一个像其他数组一样的数组。所以是的,你可以修改它。我会尝试找到一种不同的方法来做事情,尽管这样修改输入数组听起来很可疑。但是,是的,您可以这样做。您可以更改引用,但它对调用方法没有影响。因此,基本上迭代数组,使用反射查找哪些元素是
DateTime
,将它们替换为字符串。@Mr.Boy无需反射。试试看演员
对象作为DateTime?
如果不是DateTimeOh yeah,则返回null。。。在不需要的时候,很容易对每个问题进行反思!
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);
}