我有一个方法,可以在单独的参数中接受一堆字符串
public string GetQueryString(string string1, string string2, string string3...)
它应该以
的形式返回一个字符串"string1:value1 string2:value2 string3:value3..."
因为我不想将反射逻辑放在GetQueryString
的调用者中,所以我认为使用string[,]
参数不是一种选择。
我现在需要的是一种遍历所有参数并将“parName:parValue
”添加到我的S tringBuilder
的方法。
目前,我通过使用if
子句
if (!string.IsNullOrEmpty(string1))
sb.AppendFormat("{0}:{1}", "string1", string1);
如何改进?
- CLARIFICATION--
我认为OP想要做的是这样的事情:
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查询字符串。但它可以是任何可以将字符串解析为查询的搜索函数。
答案 0 :(得分:2)
问题是,只要你编译它,变量名就会消失。反思甚至不会帮助你。
我唯一能想到的就是使用表达式树(.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 :(得分:1)
为什么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,它允许您的类拥有查询参数的名称。
答案 2 :(得分:0)
我会使用JSON,它很简单,并且有很多框架。
答案 3 :(得分:0)
即使你不喜欢它,这看起来像是阵列的典型用法场景。如果absolutley必须使用显式字符串成员保留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
}
}
答案 4 :(得分:0)
这可以给你你想要的东西,没有使用反射:
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();
}
答案 5 :(得分:0)
查看此博文中的QueryStringHelper
课程:
它使用正则表达式来解析查询字符串中的字符串 - 值对并将它们放入IDictionary<string, string>
。然后,如果值不为空,您可以遍历它并将键值对添加到StringBuilder
中。
答案 6 :(得分:0)
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"));
答案 7 :(得分:0)
如果OP希望找到传递给他的方法的实际参数的名称,那么它非常简单:无法完成。实际参数的名称不会保留在任何地方。
如果参数是表达式,您希望显示什么?
好的,那个词“表达”引发了回忆。您可以通过使用LINQ中的表达式树来执行某些操作。请参阅Charlie Calvert's Community Blog : Expression Tree Basics和Expression Trees。