Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
要附加到字符串的C#非空参数_C#_C# 4.0_Parameters_Uri_.net 4.5 - Fatal编程技术网

要附加到字符串的C#非空参数

要附加到字符串的C#非空参数,c#,c#-4.0,parameters,uri,.net-4.5,C#,C# 4.0,Parameters,Uri,.net 4.5,我有一个如下所示的方法 public IResults GetResults( string code = "", string id = "", DateTime? registerDate = null, IEnumerable<Category> type = null, int pageNum = 1, bool all = fals

我有一个如下所示的方法

public IResults GetResults(
            string code = "",
            string id = "",
            DateTime? registerDate = null,
            IEnumerable<Category> type = null,
            int pageNum = 1,
            bool all = false)
            {

                ....
                ........
            }
public-IResults-GetResults(
字符串代码=”,
字符串id=“”,
DateTime?registerDate=null,
IEnumerable类型=null,
int pageNum=1,
bool all=false)
{
....
........
}
对于每个非null或非空参数,我希望将参数名称和值附加到URI字符串

例如,如果参数
code
是一个非空的
字符串
,则我希望将其作为
results/?code=passedcodevalue
附加到标准URI中。如果它是空的,那么就没有必要附加它

类似地,以下是构造URI的规则:

  • code
    id
    不为空时,将其附加到-
    results/?
    -as

    结果/?代码=abc&id=xyz

  • registerDate
    不为空时,将其附加到-
    results/?
    -作为 结果/?代码=abc&id=xyz®isterdate=2004-06-29

  • 键入
    不为空时,将其附加到-
    结果/?
    -作为 结果/?代码=abc&id=xyz®isterdate=2004-06-29&type=qwerty

  • pagenum
    不是1时,将其附加到-
    results/?
    -作为 结果/?代码=abc&id=xyz®isterdate=2004-06-29&type=qwerty&pagenum=5

  • all
    不为false时,将其附加到-
    results/?
    -as 结果/?代码=abc&id=xyz®isterdate=2004-06-29&type=qwerty&pagenum=5&all=true

  • 做这件事的最佳通用方法是什么?

    试试以下方法:

        public string GetResults(
            string code = "",
            string id = "",
            DateTime? registerDate = null,
            IEnumerable<Category> type = null,
            int pageNum = 1,
            bool all = false)
        {
            var result = "results/?";
            var firstFound = false;    //Used for add & to string
            for (int i = 0; i < 6; i++)
            {
                var partial = string.Empty;
                switch (i)
                {
                    case 0:
                        partial = GetIfNotEmpty("code", code);
                        break;
                    case 1:
                        partial = GetIfNotEmpty("id", id);
                        break;
                    case 2:
                        partial = GetIfNotEmpty("registerDate", registerDate);
                        break;
                    case 3:
                        partial = GetIfNotEmpty("type", type);
                        break;
                    case 4:
                        partial = GetIfNotEmpty("pageNum", pageNum);
                        break;
                    default:
                        partial = GetIfNotEmpty("all", all);
                        break;
                }
                if (string.IsNullOrWhiteSpace(partial))
                    continue;
                if (firstFound)
                    result += "&";
                else
                    firstFound = true;
                result += partial;
            }
            return result;
        }
    
        private string GetIfNotEmpty<T>(string name, T value)
        {
            if (value == null)
                return string.Empty;
            if (value is IEnumerable)
            {
                var enumerableFinalString = string.Empty;
                foreach (var item in ((IEnumerable)value))
                {
                    enumerableFinalString += item.ToString();
                }
                return string.Format("{0}={1}", name, enumerableFinalString);
            }
            return string.Format("{0}={1}", name, value.ToString());
        }
    
    公共字符串GetResults(
    字符串代码=”,
    字符串id=“”,
    DateTime?registerDate=null,
    IEnumerable类型=null,
    int pageNum=1,
    bool all=false)
    {
    var result=“results/?”;
    var firstFound=false;//用于添加到字符串(&T)
    对于(int i=0;i<6;i++)
    {
    var partial=string.Empty;
    开关(一)
    {
    案例0:
    partial=GetIfNotEmpty(“代码”,代码);
    打破
    案例1:
    部分=GetIfNotEmpty(“id”,id);
    打破
    案例2:
    partial=GetIfNotEmpty(“registerDate”,registerDate);
    打破
    案例3:
    partial=GetIfNotEmpty(“type”,type);
    打破
    案例4:
    partial=GetIfNotEmpty(“pageNum”,pageNum);
    打破
    违约:
    部分=GetIfNotEmpty(“全部”,全部);
    打破
    }
    if(string.IsNullOrWhiteSpace(部分))
    继续;
    如果(首次发现)
    结果+=“&”;
    其他的
    firstFound=true;
    结果+=部分;
    }
    返回结果;
    }
    私有字符串GetIfNotEmpty(字符串名称,T值)
    {
    如果(值==null)
    返回字符串。空;
    if(值为IEnumerable)
    {
    var enumerableFinalString=string.Empty;
    foreach(var项目在((IEnumerable)值中))
    {
    enumerableFinalString+=item.ToString();
    }
    返回string.Format(“{0}={1}”,名称,enumerableFinalString);
    }
    返回string.Format(“{0}={1}”,name,value.ToString());
    }
    
    在@RyanM有几个很好的答案,谢谢!但我也在研究要泛化的非null/non-empty,以及将parametr添加到名称值集合中。如果您想要自动执行此操作的代码,那么该代码需要知道默认值。你可以通过反思获得,但这需要大量的工作: