• ベストアンサー

次のVB.netのコードをC#で書くには?

以下のようなVB.netのコードをC#で書く場合、どのように書けばよいのでしょうか? ・Class1とClass2は同じメソッド、プロパティを持つ ・Class1とClass2は提供されたものなので変更することができない 環境はVisualStudio2005です。 --------------------- Dim blnFlg As Boolean = True Dim objClass As Object If blnFlg = True Then objClass = New Class1 Else objClass = New Class2 End If 'ここから無数のメソッド、プロパティを呼び出す objClass.TestMethod() objClass.TestProperty()

  • rakio
  • お礼率75% (71/94)

質問者が選んだベストアンサー

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.4

継承して共通のインターフェースを持たせるとか。 public class Class1 { public int TestMethod() { return 1; } public int TestProperty { get { return 1; } } } public class Class2 { public int TestMethod() { return 2; } public int TestProperty { get { return 2; } } } interface MyInterface { int TestMethod(); int TestProperty { get; } } class MyClass1 : Class1, MyInterface {} class MyClass2 : Class2, MyInterface {} class Program { static void Main(string[] args) { MyInterface obj = new MyClass1(); Console.WriteLine(obj.TestMethod()); Console.WriteLine(obj.TestProperty); obj = new MyClass2(); Console.WriteLine(obj.TestMethod()); Console.WriteLine(obj.TestProperty); } }

rakio
質問者

お礼

回答ありがとうございます。 なるほど、この書き方なら大分、すっきりしますね。 ありがとうございました。 <m(__)m>

その他の回答 (3)

回答No.3

>VBだと簡単にかけるので 簡単に書ける、って危ない事だと思っているんだよな…ホントに簡単か?って。個人的には。 例えば,Option Explicitのない状態って変数宣言がなくて便利なように思えるけど,タイプミスなどに気づけないっていう大きな弊害になりかねない #うまくいえないけど、VB6時代によくあったデフォルトプロパティとか ## TextBox1 = "hoge" 'TextBox1.Text = "hoge"に同じ ## 'オブジェクトの代入と区別がつきにくいのでVB6時代には ## 'オブジェクトの代入には必ずSetという構文を使う必要があった # #デフォルトのOption Strict Offには,やはり弊害があると感じる。 ============================ 僕はVB.NETでコードを書くとき Option Explicit '変数の宣言を強制 Option Strict On '暗黙の縮小型変換を許さない(今回のようなVB.NETのコードをコンパイルしようとするとエラーになる) Option Compare Binary ' 文字列の比較はバイナリベース(デフォルトと同じ) Option Infer Off '型推論の無効化。VB.NET 2008以降かも を必ず書いている。もし知らなかったら調べてみるといい。

回答No.2

/* SharpDevelop 3.1の変換機能を使ったコードはビルドできなかったorz で。 もし,Class1とClass2が共通のインターフェースを持たないなら こうやってラッパーかぶせちゃうように書くと思う。 全てのクラスのを書くのは面倒だが仕方が無い。 Reflectionを使うのもありかなとは思うけど,大抵コードが見づらくなるし,型チェックもできなくなるかな、と思うので,俺は嫌い。 */ using System; namespace test { class Program { public static void Main(string[] args) { bool blnFlg = false; hogefuga objClass = null; if (blnFlg == true){ objClass = (hogefuga)new WrappedClass1(); }else{ objClass = (hogefuga)new WrappedClass2(); } objClass.hoge(); } } class Class1{ public void hoge(){ System.Console.WriteLine("Class1"); } } class Class2{ public void hoge(){ System.Console.WriteLine("Class2"); } } interface hogefuga{ void hoge(); } class WrappedClass1:hogefuga{ private Class1 c = null; public WrappedClass1(){ c = new Class1(); } public void hoge(){ c.hoge(); } } class WrappedClass2:hogefuga{ private Class2 c = null; public WrappedClass2(){ c = new Class2(); } public void hoge(){ c.hoge(); } } }

rakio
質問者

お礼

回答ありがとうございました。 なるほど、リフレクションかラッパーかしかないようですね。 VBだと簡単にかけるのでC#の場合、自分が知らないだけだと思ってました。 詳細な解説ありがとうございました。 <m(__)m>

回答No.1

 こんにちは。  リフレクションの事でしょうか。  http://msdn.microsoft.com/ja-jp/library/f7ykdhsy(VS.80).aspx public class Class1 { public void TestMethod() { } } public class Class2 { public void TestMethod() { } } private void FormLoad(object sender, EventArgs e) { Boolean blnFlg = false; Object obj = null; if (blnFlg == true) obj = new Class1(); else obj = new Class2(); Type type = obj.GetType(); System.Reflection.MethodInfo method = type.GetMethod("TestMethod"); method.Invoke(obj, null); }

rakio
質問者

お礼

回答ありがとうございました。 なるほど、リフレクションかラッパーかしかないようですね。 VBだと簡単にかけるのでC#の場合、自分が知らないだけだと思ってました。 詳細な解説ありがとうございました。 <m(__)m>

関連するQ&A

  • VBのコードが理解できません 解説いただけないでしょうか?

    Dim ObjIE As Object Dim ObjShell As Object Dim ObjWindow As Object Dim WinExist As Boolean WinExist = False Set ObjShell = CreateObject("Shell.Application") For Each ObjWindow In ObjShell.Windows If TypeName(ObjWindow.Document) = "HTMLDocument" Then  WinExist = True  Set ObjIE = ObjWindow End If Next Set ObjShell = Nothing If Not WinExist = True Then Set ObjIE = CreateObject("InternetExplorer.Application") End If ObjIE.Navigate "http://nantokakantoka.html" ObjIE.Visible = True このコードを解説いただけないでしょうか? 特に WinExist For Each ObjWindow In ObjShell.Windows If TypeName(ObjWindow.Document) = "HTMLDocument" Then が何をしているのか分からないんです。

  • VB.NETで出来てC#で出来ない???

    VB.NETでは出来るのにC#で同じようにするやり方がわからなくて困っています。 VSのバージョンは2008です。 やりたいことは 『param.Item("AAA") = "111"』 このように書けるクラスを作りたいのですが、 VBで出来てC#では出来ないのでしょうか? イメージとしてはプロパティにメソッドをくっつけたようなクラス? C#ではこのように書くとエラーになります。 どのようにしたらいいでしょうか? public string Item(string Key) {  set { _param[Key] = value; } } VB Dim param As New Param() param.Item("AAA") = "111" ----Paramクラス---- Imports System.Text Public Class Param Private _Hash As New Hashtable Default Public Property Item(ByVal Key As String) As String Get Return _Hash(Key) End Get Set(ByVal value As String) _Hash(Key) = value End Set End Property End Class ---------

  • vb.netのプロパティの使い方について

    こんにちわ! vb.netのプロパティの使い方がわからず困っています。 具体的にはTCPクライアント接続を行い、データ送信前に現在接続を行っているかチェックを行いたいです。 作ったのは↓ Public Class Form1 'ボタンを押したら Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim tcp_conect As New System.Net.Sockets.TcpClient 'ソケット作成 Dim net_stream As System.Net.Sockets.NetworkStream = Nothing 'ストリーム取得 Dim send_bytes As Byte() = {&HFF, &H0} '送信データ tcp_conect.Connect("192.168.1.1", "2000") 'ソケット接続 net_stream = tcp_conect.GetStream() 'ソケットストリーム取得 If tcp_conect.conected = True Then 'エラーが出てしまう。 net_stream.Write(send_bytes, 0, send_bytes.Length) 'データ送信 End If tcp_conect.Close() 'ソケット閉じる End Sub End Class 'プロパティ Public Class TcpClient Dim _conect_test As Boolean Public ReadOnly Property Connected As Boolean Get Stop Return _conect_test End Get End Property End Class これでテストをしたいのですが、プロパティが実行されません。 もしかしてプロパティの使い方がそもそも違うのかもしれないのですが、、、 アドバイスのほどよろしくお願いいたします。 ちなみに使用しているのは windows7 Visual Studio Express 2012です。

  • VB6のコードをC#にしたい

    C#はこちらでよかったでしょうか。。カテゴリ違いだったらすみません。 現在、VB6にて書かれているコードを、C#にて置き換える事になりました。 しかし私はまともなオブジェクト指向の言語で組むのも初めてなら、C系の言語で組むのも初めてで、そこでどうすればいいのか困っています。 VB6で sub aa(i as integer)      dim obj as object   call bb(obj,i)   call obj.run()    end sub    sub bb(byref pobj as object,i as integer)      select case i    case 1:     pobj = new obj1    case 2:     pobj = new obj2   end select    end sub    といったようなコードがあります。obj1とobj2はVBのクラスなのですが、メソッドはどちらも同じrunというものが用意されているとします。 ようは引数の値によって、メソッドやプロパティの形は同じだけれど、メソッドの中身が違うクラスをもらって、そのもらったクラスのメソッドを実行したいわけです。 しかしC#でまったく等価のソースをかくと、当然ながらobjはただのobject形なので、そんなメソッドはないとおこられてしまいます。VB6の場合、そのあたりが厳密でないので許されていたのですが。。。 こういった場合、どのようにソースをかけばいいのでしょうか? やはりobj1,obj2のクラスの方に工夫しないといけないでしょうか? 実はこのオブジェクトを用意しているのが別チームの為、その場合こうしてくれと提案しなくてはなりません。もしそれがなくても可能であればそれにこした事はないのですが。。。 いちおうもらったクラスのタイプをしらべて、それごとにコードをかくという方法は思いついたのですが、それだとobj1、obj2にあたるクラス数が実は種類がたくさんあり、そこだけならまだしも、他にも同じようなコードをたくさんかかなくてはいけなくなってしまいます。 もう少しスマートにするにはどのようにすればいいでしょうか? こういうクラス構成にすれば、とか教えていただければ助かります。

  • このプログラムの問題点を教えてください。

    Public Cass test1 Private mBool As Boolean <Browsable(False)> _ Public Property Bool() As Boolean Get Return mBool End Get Set(ByVal value As Boolean) mBool = value End Set End Property Private GetNo(ByVal No As Integer, ByVal count As Integer) As Integer Dim intNewNo As Integer = 0 If (No + count) > 99999 Then mBool = True Else mBool = False inNewNo = No + count End If Return intNewNo End Function ※このプロパティを別のクラスで使用しました。 Public Class test2 Public sub Handan() Dim Han As test1 = New test1 If Han.Bool = True Then MsgBox("Yes") Else MsgBox("No") End If End Sub 多少端折りましたが、以上のようなプログラムを書きました。 Getnoメソッドは、test2クラスの別のメソッドで使われていたのですが、 Getnoの値によって処理を変えたかっただめ、test1にプロパティを作って 判断できるようにしました。 このコードをレビューしてもらったところ、なにか問題があったようなのですが (プロパティの意味がないとか、そういう趣旨の) レビューした本人と連絡がとれないため、どこがおかしいのかわからず困っています。 このBoolプロパティの使い方、問題がありましたら、教えてください。

  • VBのReturnの使い方

    Excel2007のVBで以下のfunctionを定義すると、Returnのところでコンパイルエラーになります。 -------------------------------------- Public Function IsTen(lNumber As Integer) As Boolean If lNumber = 10 Then Return True Else Return False End If End Function -------------------------------------- ググってみるとReturn True とか Return False とかができるように思えるのですが、何が不味いのでしょうか? VBの知識はあまりなく、低レベルな質問かもしれませんが、よろしくお願いします。

  • VB2010 のユーザコントロールのプロパティ

    お世話になっております Windows7、VB2010 Expless で開発しております 後にVS2010のVBに移行する予定です ユーザコントロールでテキストボックスを作っております そこで、初期値を設定しようと思い設定をしたのですが反映されません Imports System.ComponentModel <DefaultValue(True)> Public Property Chk_Num() As Boolean Set(ByVal value As Boolean) If (value = True) Then blnChk_Num = value Else blnChk_Num = value End If End Set Get Return blnChk_Num End Get End Property <System.ComponentModel.DefaultValueAttribute(1)> Public Property Chk_ZenHankaku() As Integer Set(ByVal value As Integer) If (value >= 0 And value <= 2) Then '0以上2以下 blnChk_ZenHankaku = value Else 'マイナス、または3以上の場合は0にする blnChk_ZenHankaku = 0 End If End Set Get Return blnChk_ZenHankaku End Get End Property どちらの方法でも、Booleanの場合は「False」、Integerの場合は「0」になってしまいます また、初期化~プロパティ宣言間に、改行しても改行しなくても結果は同じです どうにか設定できる方法はありますでしょうか よろしくお願いします

  • VB2008: クラスライブラリとはなんなのか?

    クラスライブラリとはなんなのか? 私は、クラスライブラリとはプロパティやメソッドを備えたもの。 そういう理解をしていました。 しかし、今、その認識が揺らいでいます。 それは、System.Text との出会いがきっかけ。 Imports System.IO Module mdlFileSystem   Function FileSeek(ByVal aFile As String, _ ・・・・・     If File.Exists(aFile) Then       Dim Buf(1) As Byte       Dim ec As System.Text.Encoding = System.Text.Encoding.Default       Dim fs As FileStream = New FileStream(・・・・・) これは、次のようにも書けます。 Imports System.IO Imports System.Text Module mdlFileSystem Function FileSeek(・・・・・) As String ・・・・・ If File.Exists(aFileName) Then Dim Buf(1) As Byte       Dim ec As Encoding = Encoding.Default       Dim fs As FileStream = New FileStream(・・・・・) この New 宣言を必要としない関数群とも言えるクラスライブラリ。 ここで、何が問題かと言うと実は自作の LenB関数の扱い。 Public Class Text   #Region "LenB メソッド" ・・・・・   #End Region   #Region "LenB メソッド" ・・・・・   #End Region End Class このように書くこともできます。 別にクラスライブラリなどと上段に構えなくても標準ライブラリでも用は足ります。 言わば、複数のプロパティやメソッドを装備しないのだ単なる標準ライブラリのクラスライブラリ版。 本格的なクラスライブラリ、標準ライブラリのクラスライブラリ版、標準ライブラリ。 一体、この3つをどう切り分けすべきなのであろうか? VB2008を学び始めて3週間。 しかも、プログラマでもなんでもない素人。 この辺りをどのように考えたらいいのでしょうか? どうにもスッキリしません。 「このように考えたらいいですよ」という回答をお願いします。

  • VB6のコードをVB.NETに移したいのですが

    WEBで見つけたVB6のサンプルコードをVB.NET用に書き直して いるのですが、なんとか波線のエラーはなくなったものの 実行すると、思った結果が得られません。 正しい訂正方法を教えて頂きたいです。 サンプルコードは下記のサイトにありました。 http://vbnet.mvps.org/index.html?code/internet/findfirstcacheentry.htm インターネットキャッシュに関するものです。 文字数の関係で全部は書けないのですが、現在は↓のようになっています。 その他の訂正箇所は 全部のAs Any を As Objectに変更していて、 ComboBoxのアイテムに数値が設定できないようなので、 Select Caseで判断するようにしています。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim numEntries As Long Dim cacheType As Long Select Case ComboBox1.SelectedIndex Case Is = 0 cacheType = &H1S Case Is = 1 cacheType = &H8S Case Is = 2 cacheType = &H10S Case Is = 3 cacheType = &H20S Case Is = 4 cacheType = &H40S Case Is = 5 cacheType = &H10000 Case Is = 6 cacheType = &H100000 Case Is = 7 cacheType = &H200000 Case Is = 8 cacheType = URLCACHE_FIND_DEFAULT_FILTER End Select Label1.Text = "Working ..." Label1.Refresh() ListBox1.Items.Clear() ListBox1.Visible = False numEntries = GetCacheURLList(cacheType) ListBox1.Visible = True Label1.Text = VB6.Format(numEntries, "###,###,###,##0") & "files found" End Sub Private Function GetCacheURLList(ByRef cacheType As Long) As Long Dim ICEI As INTERNET_CACHE_ENTRY_INFO Dim hFile As Long Dim cachefile As String Dim nCount As Long Dim dwBuffer As Long Dim pntrICE As Long dwBuffer = 0 hFile = FindFirstUrlCacheEntry(vbNullString, 0, dwBuffer) If (hFile = ERROR_CACHE_FIND_FAIL) And (Err.LastDllError = ERROR_INSUFFICIENT_BUFFER) Then pntrICE = LocalAlloc(LMEM_FIXED, dwBuffer) If pntrICE Then CopyMemory(pntrICE, dwBuffer, 4) hFile = FindFirstUrlCacheEntry(vbNullString, pntrICE, dwBuffer) If hFile <> ERROR_CACHE_FIND_FAIL Then Do CopyMemory(ICEI, pntrICE, Len(ICEI)) If (ICEI.CacheEntryType And cacheType) Then cachefile = GetStrFromPtrA(ICEI.lpszSourceUrlName) ListBox1.Items.Add(cachefile) nCount = nCount + 1 End If Call LocalFree(pntrICE) dwBuffer = 0 Call FindNextUrlCacheEntry(hFile, 0, dwBuffer) pntrICE = LocalAlloc(LMEM_FIXED, dwBuffer) CopyMemory(pntrICE, dwBuffer, 4) Loop While FindNextUrlCacheEntry(hFile, pntrICE, dwBuffer) End If End If End If Call LocalFree(pntrICE) Call FindCloseUrlCache(hFile) GetCacheURLList = nCount End Function どうしてもここから分からないので、お助けいただきたいです。 よろしくお願いいたします。

  • VB.NET Form1からForm2を開いたり閉じたりする方法

    VB.NET2005でForm1にあるCheckBoxをTrueにするとform2をモードレスフォームとして開き、CheckBoxをFalseにするとform2を閉じる方法がわかりません。また、form2の[×]で閉じた時にはForm1にあるCheckBoxをFalseにする方法がわかりません。 '----------------------------------- Private Sub CheckBox2_CheckedChanged ・・・   Dim f_cnt As Integer   Dim form2 As New Form2()   f_cnt = My.Application.OpenForms.Count   If CheckBox1.Checked = True Then     If f_cnt = 1 Then form1.Show() 'モードレスフォームとして表示する   Else    form2.Close() ←閉じない   End If End Sub '-----------------------------------

専門家に質問してみよう