如何将以下代码从VB.NET写入C#?

时间:2014-06-02 13:51:31

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

代码是:

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()部分。

4 个答案:

答案 0 :(得分:2)

您的代码在VB.Net中而不是在C#中工作的原因是您使用Option Strict Off(可能隐含地省略Option Strict On)。这告诉编译器假设Attributes中有一个DOMElement成员,这是一个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());
    }
}

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

答案 1 :(得分:0)

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);
    }
}
}

答案 2 :(得分:0)

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

ht.GetAttribute("class")

完整代码:

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

答案 3 :(得分:0)

你的'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());
}