いや……それと > Dim myHtmlData As New HtmlData = WebClient.DownloadString(Uri) は文法的に繋がらないですよね?
> VB.Netでもできないかな?っと言うのが始まりです。 最初の質問にあった Dim myHtmlData As New HtmlData = WebClient.DownloadString(Uri) は二重代入になるので NG ですが、代わりに Dim myHtmlData As HtmlData = WebClient.DownloadString(Uri) ならできます。これはデフォルトプロパティではなく、変換演算子のオーバーロードという手法です。
Module Module1 Sub Main() Dim r As HtmlData = "<html></html>" End Sub End Module
Public Class HtmlData Public Property HtmlDocument As String Public Shared Widening Operator CType(contens As String) As HtmlData Return New HtmlData() With {.HtmlDocument = contens} End Operator End Class
でもって、VBA の Range オブジェクトについては、内部的には Range("A1").[_Default] ="柿の種" として処理されます。
Range オブジェクトには、"_Default" という名前のプロパティがあり、 これはディスパッチ ID が 0 (DISPID_VALUE) に設定されているため、 VBA 的には「既定のメンバー」呼び出しの意味になります。
VBA 的にいえば、これは Public Property Let [_Default](Optional RowIndex As Variant, Optional ColumnIndex As Variant, ByVal vNewValue As Variant) Public Property Get [_Default](Optional RowIndex As Variant, Optional ColumnIndex As Variant) As Variant な定義に相当します。(実際には、VBA の構文では表現しきれないのですが)
Hongliangさん ご指導有難う御座います。 確かに、コンストラクタで解決できますが、 Excel VBAで Range("A1").Value="柿の種"を Range("A1")="柿の種"と書けることを VB.Netでもできないかな?っと言うのが始まりです。 VB.NetでString型の場合 Dim Range As String Range = "柿の種" とすれば値が代入できますよね? これを、独自のClassで出来ないかな? という質問でした。 有難う御座いました。
System.Windows.Forms.HtmlDocument ではなく、 COM の IHTMLDocument2 インターフェイスなら使えますが。
Dim htmlDoc As New mshtml.HTMLDocument() DirectCast(htmlDoc, IPersistStreamInit).InitNew() Dim doc As mshtml.IHTMLDocument2 = htmlDoc.createDocumentFromUrl("https://dobon.net/vb/", "")
> 既に、クラスの作成は終わっています。 HTML の解析が目的なら、AngleSharp や HtmlAgilityPack がお手軽です。
HtmlDataクラスというのは自作クラスでしょうか?
単にこのクラスに引数付きコンストラクタを用意すればいいように見えます。
Class HtmlData
Public Sub New(html As String)
Me.HtmlDocument = html
End Sub
Public Function GetElementsByTagName(...) As ...
以下略
End Class
Dim html As String = WebClient.DownloadString(url)
Dim myHtmlData As New HtmlData(html)
myHtmlData.GetElementsByTagName
WebClientを使ってHtmlDocumentを取得してゴリゴリして各要素を取得したいと考えています。既に、クラスの作成は終わっています。 Dim myHtmlData As New HtmlData myHtmlData.HtmlDocument = WebClient.DownloadString(Uri) myHtmlData.GetElementByTagName("a") のように、一旦インスタンス化してHtmlDocumentに代入した後に、メソッドを使う形になっています。これを、次のように使えるようにする方法を教えて頂けないでしょうか? Dim myHtmlData As New HtmlData = WebClient.DownloadString(Uri) myHtmlData.GetElementByTagName("a")