C#分配具有特定名称的变量

时间:2010-07-16 15:54:00

标签: c# variables

我想一起打一个简单的类,从发送到我的应用程序的HTTP请求中挑选出QueryString变量。变量并不总是以相同的顺序,但它们总是在那里。我想在我的类中为变量分配来自请求的相应变量的值,但我不知道如何执行此操作。

代码段:

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 个答案:

答案 0 :(得分:4)

使用System.Web.HttpUtilityClass.ParseQueryString。它返回一个NameValueCollection,就像你使用Request.QueryString进入ASP.NET一样。

// 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 :(得分: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);
}

<强>更新

如果您正在设置值的目标对象纯粹是DTO,则此技术只是非常安全(从其他人评论的安全角度来看),其中所有字段\属性都要由查询字符串值填充。这是我答案的原始观点。如果目标对象包含不应从查询字符串值设置的字段,则不要使用此技术,因为不打算从查询字符串值设置的字段\属性可能是。

如果您的目标对象是DTO,那么上面就可以了。我假设情况确实如此。

答案 2 :(得分: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); 
  }
} 

答案 3 :(得分:2)