C # Назначить переменную, которая имеет определенное имя - PullRequest
1 голос
/ 16 июля 2010

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

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

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

}

Любой ввод?

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

Ответы [ 4 ]

4 голосов
/ 16 июля 2010

Используйте 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"];
3 голосов
/ 16 июля 2010

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

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); 
  }
} 
3 голосов
/ 16 июля 2010

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

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

Обновление

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

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

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