我想一起打一个简单的类,从发送到我的应用程序的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.
}
}
}
}
任何输入?
我确定一个类似的问题已经存在,但我不知道该用什么来标记或标记这个问题。
答案 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)