不实用的UriBuilder类

讨论了.NET中的System.UriBuilder类存在的局限性,特别是无法有效处理URL的QueryString部分,并提出了一种继承UriBuilder的自定义解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在.net中有个System.UriBuilder类,提供修改Uri实例内容的方便方法,无需每次创建新的Uri实例。例。但是这个类并不实用,正如tmarman所说,(System.UriBuilder.GetType() == typeof(Worthless)) 。有很多朋友写过这方面的文章,也有各自的实现。但对于.net类库来说,只需一点点改动就能实现的功能,为什么会漏掉,从1.x 到2.0依然如此。

首先Fragment和Query两个成员属性只能设置其中之一,用Reflector可以看到:Query

ContractedBlock.gif ExpandedBlockStart.gif Query
 1None.gifpublic string Query
 2ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 3InBlock.gif      get
 4ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
 5InBlock.gif            return this.m_query;
 6ExpandedSubBlockEnd.gif      }

 7InBlock.gif      set
 8ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
 9InBlock.gif            if (value == null)
10ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
11InBlock.gif                  value = string.Empty;
12ExpandedSubBlockEnd.gif            }

13InBlock.gif            if (value.Length > 0)
14ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
15InBlock.gif                  value = '?' + value;
16ExpandedSubBlockEnd.gif            }

17InBlock.gif            this.m_query = value;
18InBlock.gif            this.m_fragment = string.Empty;
19InBlock.gif            this.m_changed = true;
20ExpandedSubBlockEnd.gif      }

21ExpandedBlockEnd.gif}

这里不知道为什么要设置Fragment为Empty;Fragment同样设置Query为Empty,即使通过HttpRequest取不到Url的Fragment段标记 (#) 的文本,根本用不着只取其中之一。

说这个类不实用主要是因为不能对Url的QueryString进行操作。而我们对于Uri对象的修改最主要的还是对QueryString的操作,向Url中添加或移除键值对。要实现确实很容易,只需新建一个继承于UriBuilder的类,定义一个NameValueCollection的属性。具体的代码可以看这里:UrlBuilder.cs 。代码很简单,在codeproject上也有类似的文章,不过他有一个bug,不能移除项。

转载于:https://www.cnblogs.com/qingyang/archive/2006/03/31/363304.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值