2009-03-11 6 views
-1

Ich habe ein Verfahren, dasVerketten jedes nicht leere Parameter und seinen Wert

eine Reihe von Zeichenfolgen in seperate Parameter akzeptiert
public string GetQueryString(string string1, string string2, string string3...) 

es eine Zeichenkette in der Form von

"string1:value1 string2:value2 string3:value3..." 

Weil I zurückkehren sollte Ich möchte keine Reflektionslogik in die Anrufer von GetQueryString setzen, ich denke, mit string[,] Parameter arbeiten ist keine Option.

Was muss ich nun ein Weg durch alle meine Parameter zu gehen und fügen Sie „parName:parValue“ zu meinen S tringBuilder.
Zur Zeit mache ich das von jedem von ihnen mit einer if Klausel

if (!string.IsNullOrEmpty(string1)) 
    sb.AppendFormat("{0}:{1}", "string1", string1); 

Überprüfung Wie kann diese verbessert werden?

--CLARIFICATION--
Was ich glaube, dass der OP will, ist, etwas zu tun wie folgt aus:

string str1 = "Hello"; 
string s2 = "World"; 
string MyStr = "Greetings"; 
string YourStr = "Earthlings"; 
string query = GetQueryString(str1, s2, MyStr, YourStr); 

und senden Sie es haben "str1:Hello s2:World MyStr:Greetings YourStr:Earthlings"

--EDIT--
Klärung richtig.
Da meine Methode GetQueryString heißt, bedeutet das nicht, dass ich an einer HTML-Abfrage-Zeichenfolge arbeite. In diesem speziellen Fall ist es tatsächlich eine Lucene-Abfragezeichenfolge. Aber es könnte jede Suchfunktion sein, die Strings zu einer Abfrage verarbeiten kann.

+0

Ich verstehe nicht. Was hat reflecton mit params string [] args zu tun? –

+0

Der Aufrufer sollte dann auch den Namen des Parameters übergeben. Sollte also der Name des Parameters bekannt sein, so sollte Reflexion verwendet werden. –

+0

OP aktualisieren, damit Wert/Name-Paare berücksichtigt werden –

Antwort

2

Das Problem ist, sobald Sie diese kompilieren, gehen die Variablennamen entfernt. Die Reflexion wird dir nicht einmal helfen.

Das einzige, was ich daran arbeiten kann denken kann, ist ein Ausdrucksbaum (.NET v3.5 +)

string GetQueryString(Expression<Func<String, string>> exprTree) 
{ 
    // walk expreTree. 
    // exprTree.Body.Left.Name would be the name of the variable 
    // exprTree.Body.Left.Value would be it value. 
} 

string q = GetQueryString((str1, s2, MyS, YourS) => str1 + s2 + MyS + YourS); 
+0

Es ist nicht wirklich eine einfache Lösung, aber Ihre erste Aussage ist im Grunde die "Antwort", die ich suchte. –

+0

"Die Variablennamen werden verschwinden" Sind Sie sich sicher? Da die Relektoren die richtigen Variablennamen haben, nehme ich an, dass .NET sie bewahrt und irgendwie zugänglich ist. –

+0

Reflektor hat nicht immer die Variablennamen für lokale Variablen. Du siehst Dinge wie "flag2". Vielleicht ist es in der Lage, Debug-Symbole zu sehen. –

0

Ich würde JSON dafür verwenden, es ist einfach und es gibt viele Frameworks da draußen.

+0

Könntest du ein wenig näher ausführen? –

1

Warum benötigt Params Reflexion? Eine Möglichkeit, dies zu lösen, ist meiner Meinung nach, ein params-Schlüsselwort zu verwenden und ein Wörterbuch für den Namen und Wert zu verwenden.

Oder tun Sie es wie Sie tun. Wenn Sie params verwenden, können Sie einige Überladungen bereitstellen, die einen oder zwei Parameter benötigen, um zu vermeiden, dass das Array aufgebaut wird. Dies ist eine winzige Optimierung string.format().

bearbeiten

Eine weitere Möglichkeit ist, ein Objekt zu schaffen, die die möglichen Parameter darstellt, und dann, dass serialisiert. Sie könnten dann Reflektion verwenden, um durch Ihre eigenen Felder zu gehen. In diesem Fall könnten Sie eine Basisklasse erstellen und die Algorithmen isolieren, um verschiedene Repräsentationen zu ermöglichen.

public abstract class QueryParams 
{ 
    pubic string GetQueryString() 
    { 
    //use reflection here 
    } 
} 

public class MyQueryParams : QueryParams 
{ 
    public QueryParam MyParam1 
    { 
    get 
    { 
      if (_myParam1==null) 
      { 
      _myParam1=new QueryParam("MyParam1"); 
      } 
      return _myParam1; 
     } 

} 

public class QueryParam 
{ 
    public string Name; 
    public string Value; 
} 

bearbeiten

oben Codebeispiel Modified QueryParam einschließen, die Ihre Klasse den Namen der Abfrageparameter besitzen können.

+0

Da ich keyValuePairs benötigen würde (ich brauche den Namen des Parameters), sollte die aufrufende Methode dann wissen, was der Name ist. –

0

Auch wenn Sie es nicht sehr mögen, sieht dies wie ein typisches Anwendungsszenario für ein Array aus. Wenn Sie absolutley die GetQueryString mit expliziter String Mitglieder halten müssen, können Sie auf eine andere Methode weiterzuleiten, wie zum Beispiel:

public string GetQueryString(string string1, string string2, string string3...) 
{ 
    return GetQueryStringImpl(string1, string2, string3, ...); 
} 

public string GetQueryStringImpl(params string[] strings) 
{ 
    foreach (string s in strings) 
    { 
      // check s for null and append to query string 
    } 
} 

aber ich Frage der Grund, warum würden Sie diese explizite Parameter in erster Linie müssen, bevor Sie eine solche Lösung.

aktualisieren:

Ich habe gerade wieder gelesen und bemerkt, dass Sie die Namen als auch wollte. so etwas wie dieses Solange die Werte Strings sind funktionieren könnte:

public string GetQueryString(string string1, string string2, string string3...) 
{ 
    return GetQueryStringImpl("name1", string1, "name2", string2, "name3", string3, ...); 
} 

public string GetQueryStringImpl(params string[] strings) 
{ 
    for (int i=0; i<strings.Length; i+=2) 
    { 
      var name = strings[i]; 
      var s = strings[i+1]; 
      // check s for null and append to query string 
    } 
} 
0

Dies sollte Sie geben, was Sie wollen, ohne Reflexion verwendet:

public string GetQueryString(params string[] inStrings) 
{ 
    StringBuilder sb = new StringBuilder(); 
    int iCount = 1; 
    foreach (String s in inStrings) 
    { 
     if (iCount > 1) 
      sb.Append(" ");   
     sb.AppendFormat("{0}{1}:{1}", "string", iCount, s); 
     iCount++; 
    } 
    return sb.ToString(); 
} 
+0

in der Tat, weil meine Beispiel-Strings String1, String2 usw. genannt werden. Aber in realen Fällen werden diese Dinge wie "Firma" und "Farbe" –

0

Schauen Sie sich die QueryStringHelper Klasse in diesem Blog-Eintrag:

http://bloggingabout.net/blogs/stephan/archive/2008/12/01/passing-query-string-parameters-to-a-silverlight-app-hosted-in-html.aspx

Es verwendet regex die Zeichenfolge-Wert-Paare in einer Abfrage Zeichenfolge zu analysieren und setzt sie in eine IDictionary<string, string>. Sie könnten dann eine Schleife durchlaufen und die Schlüssel/Wert-Paare in Ihre StringBuilder einfügen, wenn der Wert nicht null ist.

0
public string GetQueryString(params string[] paramName) 
{ 
    var result = from p in paramName 
       where !String.IsNullOrEmpty(p) 
       select p + ":" + Request.QueryString[p]; 
    return String.Join(" ", result.ToArray()); 
} 

Wo der Anruf könnte sein:

Response.Write(GetQueryString("param1", "param2", "param4")); 
+0

genannt, dies ist explizit webbezogen, während dies in meinem Fall nicht der Fall ist. Ich spreche über Lucene Query String, wenn Sie es wissen möchten. –

0

zu verwenden, wenn das OP sucht die Namen der aktuellen Parameter finden weitergegeben zu seiner Methode, dann ist es sehr einfach: es kann nicht getan werden. Die Namen der aktuellen Parameter werden nirgends gespeichert.

Was möchten Sie anzeigen, wenn der Parameter ein Ausdruck wäre?


Ok, das Wort "Ausdruck" löste eine Erinnerung. Sie können möglicherweise etwas tun, indem Sie Ausdrucksbäume von LINQ verwenden. Siehe Charlie Calvert's Community Blog : Expression Tree Basics und Expression Trees.

Verwandte Themen