Конкатенация каждого непустого параметра и его значения - PullRequest
0 голосов
/ 11 марта 2009

У меня есть метод, который принимает несколько строк в отдельных параметрах

public string GetQueryString(string string1, string string2, string string3...)

Должен возвращать строку в виде

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

Поскольку я не хочу помещать логику отражения в вызывающие элементы GetQueryString, я думаю, что работать с параметрами string[,] не вариант.

Теперь мне нужно пройтись по всем моим параметрам и добавить «parName:parValue» к моему S tringBuilder.
В настоящее время я делаю это, проверяя каждый из них с помощью if clause

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

Как это можно улучшить?

- ОЧИЩЕНИЕ -
Я считаю, что ОП хочет сделать что-то вроде этого:

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

и вернуть "str1:Hello s2:World MyStr:Greetings YourStr:Earthlings"

- EDIT -
уточнение правильное.
Кроме того, поскольку мой метод называется GetQueryString, это не значит, что я работаю над строкой запроса HTML. В данном конкретном случае это фактически строка запроса Lucene. Но это может быть любая функция поиска, которая может анализировать строки в запросе.

Ответы [ 8 ]

2 голосов
/ 11 марта 2009

Проблема в том, что как только вы скомпилируете это, имена переменных исчезнут. Отражение даже не поможет тебе.

Единственное, о чем я могу думать, это может работать, это использовать дерево выражений (.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);
1 голос
/ 11 марта 2009

Почему params требует отражения? По моему мнению, один из способов решить эту проблему - использовать ключевое слово params и использовать словарь для имени и значения.

Или делай как дела. Если вы используете params, вы можете обеспечить некоторые перегрузки, которые принимают один-два или три параметра, чтобы избежать создания массива. Это крошечная оптимизация string.format () делает.

Редактировать

Другой вариант - создать объект, представляющий возможные параметры, а затем сериализовать его. Затем вы можете использовать отражение, чтобы пройтись по вашим собственным полям, в этом случае вы можете создать базовый класс и изолировать алгоритм, допускающий разные представления.

public abstract class QueryParams
{
    public 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;
}

Редактировать

Модифицированный выше пример кода включает QueryParam, который позволяет вашему классу иметь имя параметров запроса.

0 голосов
/ 11 марта 2009

Если ОП ищет имена фактических параметров, переданных его методу, то это очень просто: это невозможно сделать. Имена фактических параметров нигде не хранятся.

Что бы вы хотели отобразить, если бы параметр был выражением?


Хорошо, это слово «выражение» вызвало воспоминание. Вы могли бы что-то сделать, используя деревья выражений из LINQ. См. Блог сообщества Чарли Калверта: Основы дерева выражений и Деревья выражений .

0 голосов
/ 11 марта 2009
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());
}

Где может быть звонок:

Response.Write(GetQueryString("param1", "param2", "param4"));
0 голосов
/ 11 марта 2009

Ознакомьтесь с классом QueryStringHelper в этом посте:

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

Он использует регулярное выражение для анализа пар строка-значение в строке запроса и помещает их в IDictionary<string, string>. Затем вы можете выполнить цикл и добавить пары ключ-значение в ваш StringBuilder, если значение не равно нулю.

0 голосов
/ 11 марта 2009

Это должно дать вам то, что вы хотите, без отражения:

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 голосов
/ 11 марта 2009

Даже если вам это не очень нравится, это похоже на типичный сценарий использования массива. Если вы абсолютно обязаны хранить GetQueryString с явными строковыми членами, вы можете перейти к другому методу, например:

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
     }
}

Однако я бы поставил под сомнение причину, по которой вам нужны эти явные параметры, прежде чем использовать такое решение.

Обновление

Я только что перечитал и заметил, что вы тоже хотели имена. Пока значения являются строками, что-то вроде этого может работать:

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 голосов
/ 11 марта 2009

Я бы использовал для этого JSON, он прост и имеет множество фреймворков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...