2017-10-06 53 views
1

我只有兩年的時間開始編程(主要是C#),但仍然有很多我不懂的語言,我試圖翻譯一個從VB.NET代碼到C#代碼的Web項目,但我到了一個我不知道如何翻譯的部分。翻譯爲C#代碼使用類方法通過一個對象變量

VB代碼中的類使用子過程對數據庫執行INSERT,爲此,在類中存在一個聲明爲Object的db變量,然後db變量使用模塊中的函數根據連接類型更改類的類型,並且將使用數據庫(這是通過從Web.config文件獲取值確定的),然後在構建查詢之後,db變量使用分配的新類類型中的另一個函數執行查詢。

爲了更好地說明問題,這裏是VB代碼。

這是其中使用分貝可變的部分:

Public class MyClass1 
    Private Sub _AddDB() 
     Dim db As Object 
     Dim query As String 

     db = TypeDB() 
     query = "Some Query" 
     db.ExecuteDB(query) 
    End Sub 
End Class 

正如我所說,TypeDB()函數是在一個模塊:

Module MyModule 
    Public Function TypeDB() As Object 
     Dim Str As String = ConfigurationSettings.AppSettings.GetValues("strConnDB").GetValue(0) 
     Dim db As Object 

     Select Case Str 
     Case "SQL" 
      db = New DBSql_Class 
     Case "ODBC" 
      db = New DBOdbc_Class 
     Case "OLE" 
      db = New DBOle_Class 
     End Select 
     TypeDB = db 
    End Function 
End Module 

每個上提到的類的模塊有它自己的ExecuteDB函數,因此在執行db.ExecuteDB(query)行時沒有問題。我讀的是最接近C#中的模塊是一個靜態類,所以這是我做什麼用MyModule的,我已經有了類的休息,但是當我嘗試:

public class MyClass1 
{ 
    private void _AddDB() 
    { 
     object db; 
     string query; 

     db = MyModuleClass.TypeDB(); 
     query = "Some Query"; 
     db.ExecuteDB(query); 
    } 
} 

我立即得到錯誤,數據庫objetc不包含方法ExecuteDB的定義。

我的第一個想法是在_AddDB方法內部執行一個switch語句,但它不會是最優的,因爲MyModuleClass中已經有一個switch語句爲db變量選擇新類型,我嘗試搜索爲解決方案,但我發現只有解決方案只使用一個類。

我想盡可能地接近最初的項目,但這種交互方式遍佈VB項目。

回答

3

在C#中面向對象的乾淨解決方案是用ExecuteDB()操作定義一個接口,並在這三個數據庫類中實現它。然後從靜態方法返回該接口,然後您可以直接調用它。

interface IDatabase { 
    object ExecuteDB(string); 
} 

class DBSql_Class : IDatabase { 
    public object ExecuteDB(string query) { 
    ... 
    } 
} 

static class MyModuleClass { 
    public static IDatabase TypeDB() { 
    switch(...) { 
     ... 
     return new DBSql_Class(); 
     ... 
    } 
    }   
} 

只是說明:你的班級名稱是可怕的。在.NET中編程時,請嘗試遵循標準命名方案。 :-)

+0

我會試試這個,但是三個DB類已經從另一個類繼承了,我可以從接口添加繼承嗎?,至於名字,是的,他們是可怕的,但我在辦公室,他們是第一個彈出我腦海中的名字:) –

+0

我做了一些快速搜索,我看到我可以從其他的繼承類和從接口的實現,我會盡快嘗試一下,我有一些空閒時間 –

+0

@ G.Torres:是的,從技術上講,如果他們繼承了一個共同的基礎,你可以使其抽象,添加'抽象'方法'ExecuteDB '去那個基地班。然後返回類型的'TypeDB'方法可以是該基類。但是從乾淨代碼的角度來看,我更喜歡界面。 :-) –

2

您需要在C#中聲明'db'爲動態的,以實現與VB代碼所執行的相同類型的後期綁定。 例如,

dynamic db = null; 
    string query = null; 

    db = MyModule.TypeDB(); 
    query = "Some Query"; 
    db.ExecuteDB(query); 

或者更好的是,使用適當的類型,而不是 '對象'。

+0

我不知道動態,我會嘗試,對於propper類型我不能直接使用它們,因爲我不知道哪個是將要使用的,那個位是在調用TypeDB函數時讀入Web.config文件。 –