2017-01-10 5 views
-2

У меня есть куча методов, которые заменяют значения в параметризованный URL и называют этот URL как WebRequest. Я вытащил это в метод полезностиМогу ли я изменить содержимое массива params?

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

Но мне нужно, чтобы убедиться, что все объекты DateTime отформатированы определенным образом. Чтобы спасти меня от этого в каждом вызывающем методе, могу ли я сделать BuildMethodCall изменить элементы params так или иначе, чтобы каждый DateTime dt был заменен на dt.ToString(format)?

+4

Вы можете попробовать и посмотреть, что произойдет. Или вы можете проецировать новый массив из аргумента params и оставить исходный без изменений. –

+0

Возможно, вы можете использовать перехватчик, который сделает это для вас в каждом запросе? http://stackoverflow.com/questions/7083559/where-and-how-to-use-interceptors-in-web-application – acostela

+0

Кажется, что мало усилий на самом деле попробовать. Почему вы не написали две строки кода, чтобы проверить это? –

ответ

3

params -array - это обычный массив, как и каждый другой. Вы можете изменить его записи, как хотите, но, конечно, не его ссылка (так как она не сглажена out или ref).

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, и оставить неизменным входные значения.

+2

Вы можете изменить ссылку, но она не влияет на метод вызова. –

+0

Yeap, вы правы. – HimBromBeere

+0

Итак, в основном, итерации массива, используйте отражение, чтобы найти, какие элементы 'DateTime', заменить их на строки. –

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... 
} 
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); 
} 
Смежные вопросы