【问题标题】:How to write the following code from VB.NET to C#?如何将以下代码从 VB.NET 写入 C#?
【发布时间】:2014-06-02 13:51:30
【问题描述】:

代码是:

Public Class Form1

    Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        Dim item As HtmlElementCollection
        item = WebBrowser1.Document.GetElementsByTagName("span")
        Dim ht As HtmlElement
        For Each ht In item
            MsgBox(ht.DomElement.attributes("class").value.ToString)
        Next
    End Sub
End Class

在 C# 中,它找不到 .attributes("class").value.ToString() 部分。

【问题讨论】:

  • 在我的脑海中,C# 索引器使用方括号,所以 attributes["class"]... 未经测试或检查。
  • 这个问题不是“请转换我的代码”问题,但 OP 正在尝试解决转换为 C# 时出现的合法问题(他自己完成了转换并碰壁了)。请考虑删除反对票
  • @DanVerdolino 最后,有人理解我的问题。无论如何,这并没有给我带来太多困扰,有些人真的很喜欢在提出问题 3 秒后投反对票……

标签: c# vb.net vb.net-to-c#


【解决方案1】:

您的代码在 VB.Net 而不是 C# 中工作的原因是您使用了Option Strict Off(可能通过省略Option Strict On 隐含地)。这告诉编译器假设DOMElement 中有一个Attributes 成员,即Object

在 C# 中,一般情况下没有与 Option Strict On 等价的类型,但如果您使用 dynamic 类型,则可以做同样的事情。

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    var item = webBrowser1.Document.GetElementsByTagName("span");
    foreach(HtmlElement ht in item)
    {
        dynamic element = ht.DomElement;
        MessageBox.Show(element.Attributes["class"].Value.ToString());
    }
}

这允许您访问在设计时不知道的类型的属性,只要它们在运行时存在,类似于 VB.Net 中的 ObjectOption Strict Off。不过要小心,因为这允许您编写代码有些鲁莽(类似于 VB :) 所以在这种情况下您应该添加一些检查和异常处理。

【讨论】:

    【解决方案2】:
    using Microsoft.VisualBasic;
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Data;
    using System.Diagnostics;
    public class Form1
    
    {
    
    private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        HtmlElementCollection item = default(HtmlElementCollection);
        item = WebBrowser1.Document.GetElementsByTagName("span");
        HtmlElement ht = default(HtmlElement);
        foreach ( ht in item) {
            Interaction.MsgBox(ht.DomElement.attributes("class").value.ToString);
        }
    }
    }
    

    【讨论】:

      【解决方案3】:

      我认为正确的值会在这里:

      ht.GetAttribute("class")
      

      完整代码:

      HtmlElementCollection items;
      items = WebBrowser1.Document.GetElementsByTagName("span");
      HtmlElement ht;
      foreach (ht in items) {
          MessageBox.Show(ht.GetAttribute("class"));
      }
      

      【讨论】:

      • 不幸的是,它不起作用。它给了我“System.__COMObject”而不是实际的 strinh。所以我希望像在 Visual Basic .NET 中那样通过 DomElement 来实现
      【解决方案4】:

      您的“foreach”循环需要在 C# 中包含变量类型:

      foreach (HtmlElement ht in item)
      {
          MessageBox.Show(ht.DomElement.Attributes["class"].Value.ToString());
      }
      

      此外,由于 HtmlElement 类的“DomElement”属性返回“Object”,因此您必须在调用“Attributes”属性之前将“ht.DomElement”转换为适当的类型。我只是猜测它是一个索引器,但由于 'DomElement' 返回 Object,它只是 - 一个猜测。

      例如,

      foreach (HtmlElement ht in item)
      {
          MessageBox.Show((SomeType)(ht.DomElement).Attributes["class"].Value.ToString());
      }
      

      【讨论】:

        猜你喜欢
        • 2011-04-27
        • 2016-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-24
        • 1970-01-01
        相关资源
        最近更新 更多