2014-06-02 3 views
-3

Кодекс:Как написать следующий код с VB.NET на 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() часть.

+1

Off верхней части моей головы, C# индексаторах использовать квадратные скобки, так 'атрибуты [ "класс"]' ... Не тестировался или проверено. – RemarkLima

+1

Этот вопрос не является вопросом «просьба преобразовать мой код», но ОП пытается решить законную проблему, возникающую при конвертации в C# (он сам сделал преобразование и ударил стену). Пожалуйста, подумайте об удалении downvotes – djv

+1

@DanVerdolino Наконец, кто-то, кто понял мою проблему. Во всяком случае, это меня не сильно беспокоит, некоторые люди действительно наслаждаются голосом через 3 секунды после того, как вопрос был задан ... –

ответ

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 :), поэтому в этом случае вы должны добавить некоторую проверку и обработку исключений.

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

Я думаю, что правильное значение здесь:

ht.GetAttribute("class") 

Полный код:

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

К сожалению, он не работает. Это дает мне «System .__ COMObject» вместо фактического strinh. Поэтому я ищу сделать это через DomElement, как в Visual Basic .NET. –

0

Ваш «Еогеасп» петля должна иметь тип переменный, включенный в C#:

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

Кроме того, поскольку свойство «DOMElement» возвращения классной HtmlElement «Object», вам придется бросить " ht.DomElement "до соответствующего типа перед вызовом свойства« Атрибуты ». Я только догадывался, что это был индекс, но так как «DomElement» возвращает Object, это просто - предположение.

например,

foreach (HtmlElement ht in item) 
{ 
    MessageBox.Show((SomeType)(ht.DomElement).Attributes["class"].Value.ToString()); 
} 
Смежные вопросы