给VB专家的问题在这里!

我用C#编写了以下代码:

public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
    HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty()
    {
        Headers =
        {
            "test", "test"
        }
    };
    request.Properties.Add(HttpRequestMessageProperty.Name, httpRequestProperty);
    return null;
}

我曾try 将其转换为如下的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应该是相似的,我应该能够做到这一点.如果由于某种原因,这在VB中是不可能的,我如何才能实现与我的C#代码中相同的呢?

推荐答案

我认为C#语法实际上并不是将Headers赋给一个新值(它确实是readonly,即使在初始化式中也不能赋值),而是在集合中的每一项上调用Headers.Add.

具有集合属性的内联初始值设定项的等效C#代码为:

HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty()
httpRequestProperty.Headers.Add("test", "test")

请注意,Headers不是set,而是在内部设置的,并且创建了Add调用.

在VB中实现这一点的规范方法是:

Dim httpRequestProperty As HttpRequestMessageProperty = New HttpRequestMessageProperty()
httpRequestProperty.Headers.Add("test", "test")

可能有一种更巧妙的VB语法来内联Add,但我会从有效的方法开始,然后决定是否值得花时间和精力找到一种内联它的方法.

Csharp相关问答推荐

将多个enum值传递给MAUI中的转换器参数的XML语法是什么?

Dapper是否可以自动扩展类成员

在. NET Core 8 Web API中,当为服务总线使用通用消费者时,如何防止IServiceProvider被释放或空?"

如何从HttpContext获取请求正文

需要澄清C#的Clean Architecture解决方案模板的AuditableEntityInterceptor类

在FilePath中搜索一个词,并根据First Match从左到右提取文件路径

查找表中的模式

如何在C#中从正则表达式中匹配一些数字但排除一些常量(也是数字)

使用带有WithAppOnly()请求选项的pageIterator

是否有必要在ASP.NET Core中注册可传递依赖项?

如何在CSharp中将json字符串转换为DataTable?

Blazor Fluent UI DialogService,<;FluentDialogProvider/>;错误

如何避免在.NET中将日志(log)写入相对路径

使用动态键从请求体反序列化JSON

匿名类型的AbstractValidator

我想根据姓氏按字母顺序对包含150行徽章编号、姓氏、名字、地址等的文件进行排序.e

C#命名管道-编码错误?

C#静态抽象属性不能被子接口覆盖

NETSDK1201:对于面向.NET 8.0和更高版本的项目,默认情况下,指定RUNTIME标识符将不再生成自包含的应用程序

测试单个对象是否与Func<;T,bool>;匹配