2017-01-10 7 views
-2

私は、パラメータ化されたURLに値を代入し、このURLをWebRequestとして呼び出す方法があります。私は、ユーティリティメソッドparams配列の内容を変更できますか?

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

にこれを引っ張っしかし、私はすべてのDateTimeのオブジェクトが特定の方法でフォーマットされていることを確認する必要があります。各呼び出しメソッドでこれを行う私を保存するにはBuildMethodCall何らかの理由でparams要素を変更することができますので、それぞれDateTime dtdt.ToString(format)に置き換えられますか?

+4

あなたはそれを試して何が起こるか見ることができます。あるいは、params引数から新しい配列を投影し、元の配列をそのまま残すこともできます。 –

+0

たぶん、すべてのリクエストでそれを行うインターセプタを使用できますか? http://stackoverflow.com/questions/7083559/where-and-how-to-use-interceptors-in-web-application – acostela

+0

実際に試してみるのは少しの努力のようです。なぜこれをテストするために2行のコードを書かなかったのですか? –

答えて

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 
} 

は、しかし、これはまったく効果がありません呼び出しコードに渡します。

編集:上記のことは、すでに導入されている変数のセマンティクスを変更するのは良い考えではありません。実際のDateTime -instancesを含むoutとして渡された配列を追加し、入力値を変更しないでください。

+2

参照を変更することはできますが、呼び出し元メソッドには影響しません。 –

+0

イェップ、そうです。 – HimBromBeere

+0

したがって、基本的に配列を反復し、リフレクションを使って、どの要素が「DateTime」であるかを見つけ出し、それらをStringsで置き換えます。 –

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); 
} 
関連する問題