2010-07-16 3 views
1

Я хочу пропустить простой класс вместе, чтобы выбрать переменные QueryString из HTTP-запроса, который отправляется в мое приложение. Переменные не всегда в одном порядке, но они всегда есть. Я хочу присвоить переменным в своем классе значения соответствующих переменных из запроса, но я понятия не имею, как это сделать.C# Назначить переменную, которая имеет определенное имя

Фрагменты кода:

MyHTTPRequest ar = new MyHTTPRequest("GET /submit.php?variableOne=value&variableTwo=someothervalue HTTP/1.1"); // Leaving out the rest for now 


class MyHTTPRequest 
{ 
    public string variableOne; 
    public string variableTwo; 
    public string variableThree; 

    private string[] properties = { "variableOne", "variableTwo", "variableThree" }; // I know they're not actually properties 

    public MyHTTPRequest(string request) 
    { 
     string[] variablePars = request.Substring(16, request.Length - 24).Split('&'); // variablePars now contains "variableOne=value" & "variableTwo=someothervalue" 

     foreach (string variablePar in variablePars) 
     { 
      if (properties.Contains(variablePar.Split('=')[0])) // variableOne, variableTwo, variableThree 
      { 
       // Assign the correct variable the value 
       <???> = variablePar.Split('=')[1]; // I don't know how to pull this one off. variablePar.Split('=')[0] should contain the name of the variable. 
      } 
     } 
    } 

} 

Любой вход?

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

+0

Возможно, вы захотите изучить использование Reflection для этого. –

ответ

3

Почему бы не повернуть его?

class MyHTTPRequest { 
    public string variableOne { get { return _values["variableOne"]; } } 
    public string variableTwo { get { return _values["variableTwo"]; } } 
    public string variableThree { get { return _values["variableThree"]; } } 
    NameValueCollection _values; 
    public MyHTTPRequest(string queryStringText) { 
    _values = HttpUtility.ParseQueryString(queryStringText); 
    } 
} 
+0

Я пойду с таким подходом. Спасибо, парни – pastapockets

2
+0

Я использую TcpClient, чтобы получить запрос, и я действительно хотел бы решить эту проблему. :-) – pastapockets

+0

У меня создалось впечатление, что вы спрашиваете, как сервер может извлекать значения запроса из запроса. –

+0

Я вижу, что кто-то еще сделал (помечен как asp.net). Это приложение C#, получающее пакеты из другой программы на локальном компьютере. Английский язык не мой родной язык, и вопрос, вероятно, слишком нечеткий. – pastapockets

3

Вы можете использовать отражение, чтобы сделать это следующим образом:

PropertyInfo property = YourDtoClass.GetType().GetProperty("ThePropertyName"); 

if (property != null) 
{ 
    property.SetValue(theTargetObject, theValue); 
} 

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

Или, используя поля вместо свойств:

FieldInfo field = YourDtoClass.GetType().GetField("theFieldName"); 

if (field != null) 
{ 
    field.SetValue(theTargetObject, theValue); 
} 

Update

Этот метод только действительно безопасна (с точки зрения безопасности, как другие комментировал), если целевой объект, который вы устанавливаете значения на является чисто DTO, где все поля \ свойства предназначены для заполнения значениями строки запроса. Это была оригинальная точка зрения моего ответа. Если целевой объект содержит поля, которые не должны быть установлены из значений строки запроса, не используйте эту технику, поскольку поля \ свойства, которые не предназначены для установки из значений строки запроса, могут быть.

Если ваш целевой объект является DTO, то это хорошо. Я предполагаю, что это так.

+0

Правильно, за исключением того, что это прерывает момент передачи параметра, который не имеет соответствующего свойства. Вы можете обходить это, проверяя перед настройкой, но я думаю, что более общее решение - избавиться от полей и использовать коллекцию. –

+0

@Steven Wrong - это то, что означает «if (property! = Null)». –

+0

Это может стать кошмаром безопасности. Ни в коем случае строка запроса не может напрямую влиять на параметры класса. – drharris

4

Используйте System.Web.HttpUtilityClass.ParseQueryString. Он возвращает NameValueCollection так же, как вы получаете в ASP.NET с Request.QueryString.

// assuming you can parse your string to get your string to this format. 
string queryStringText = "variableOne=value&variableTwo=someothervalue"; 

NameValueCollection queryString = 
    HttpUtility.ParseQueryString(queryStringText); 

string variable1 = queryString["variableOne"]; 
string variable2 = queryString["variableTwo"]; 
+1

Использование этого класса для синтаксического анализа - это хорошая деталь, но реальная проблема заключается в том, как сопоставить значения querystring с классом. OP стремится к чему-то основанному на размышлении, в то время как я предупреждаю об этом. –

+0

Не отвечает ли это на присвоение переменных. Если имена переменных строки запроса известны, но порядок не указан, это разрешает это, поскольку имя параметра используется для его получения. В моем примере кода variable1 всегда будет присваиваться переменной variableOne независимо от порядка параметра в строке запроса. – btlog

+0

Если у нас уже есть значения в коллекции, зачем нам их дополнительно копировать в поля? –

Смежные вопросы