C# 我可以修改参数数组的内容吗?
我有一系列方法将值替换为参数化URL,并将此URL称为WebRequest。我把它变成了一个实用的方法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
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);
}