连接每个非空参数及其值

时间:2009-03-11 13:03:25

标签: c# .net reflection

我有一个方法,可以在单独的参数中接受一堆字符串

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查询字符串。但它可以是任何可以将字符串解析为查询的搜索函数。

8 个答案:

答案 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课程:

http://bloggingabout.net/blogs/stephan/archive/2008/12/01/passing-query-string-parameters-to-a-silverlight-app-hosted-in-html.aspx

它使用正则表达式来解析查询字符串中的字符串 - 值对并将它们放入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 BasicsExpression Trees