VB中正确初始化类:C#转VB时Headers只读问题排查与解决
VB中HttpRequestMessageProperty Headers初始化报错问题
问题场景
我有一段实现WCF客户端消息拦截的C#代码,功能是在请求发送前给消息添加自定义HTTP头:
public object BeforeSendRequest(ref Message request, IClientChannel channel) { HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty() { Headers = { "test", "test" } }; request.Properties.Add(HttpRequestMessageProperty.Name, httpRequestProperty); return null; }
尝试将其转换为VB代码时,写出了以下版本:
Public Function BeforeSendRequest(ByRef request As Message, ByVal channel As IClientChannel) As Object Dim httpRequestProperty As HttpRequestMessageProperty = New HttpRequestMessageProperty() With { .Headers = { {"test", "test"} } } request.Properties.Add(HttpRequestMessageProperty.Name, httpRequestProperty) Return Nothing End Function
但Visual Studio提示Headers是只读属性,无法通过这种方式初始化。明明C#的逻辑可以正常运行,想知道问题原因,以及VB里如何实现相同效果。
报错原因
C#和VB的对象/集合初始化语法存在关键差异:
- C#中
Headers = { "test", "test" }并非直接给只读属性赋值,而是集合初始化语法糖:编译器会识别到Headers是HttpRequestHeaders类型(实现了支持Add方法的集合接口),自动将大括号内的参数转换为对Headers.Add("test", "test")的调用,本质是调用集合的添加方法而非给属性赋值。 - VB的
With { .Headers = { {"test", "test"} } }会被编译器解析为直接对只读属性Headers进行赋值操作,而Headers本身没有setter,因此触发只读属性的报错——VB没有类似C#的这种“针对属性集合的初始化语法糖”,无法自动将赋值操作转换为集合的Add调用。
解决方案
在VB中,需要显式调用Headers.Add方法来添加头信息,代码如下:
Public Function BeforeSendRequest(ByRef request As Message, ByVal channel As IClientChannel) As Object ' 先实例化HttpRequestMessageProperty对象 Dim httpRequestProperty As New HttpRequestMessageProperty() ' 显式调用Add方法添加HTTP头 httpRequestProperty.Headers.Add("test", "test") ' 将属性添加到请求的Properties中 request.Properties.Add(HttpRequestMessageProperty.Name, httpRequestProperty) Return Nothing End Function
这种写法完全等价于原C#代码的功能,通过直接操作集合对象的方法来添加头信息,避开了对只读属性的赋值操作。
内容的提问来源于stack exchange,提问作者BladeZ
相关产品推荐
相关产品推荐

