2010-10-01 99 views
1

我有覆蓋保護GetService的方法,並將其分配到的IServiceProvider接口的控制:轉換Inteface從vb.net到C#

Class MyControl 
    Inherits Control 
    Implements IServiceProvider 

    Protected Overrides Sub GetService(t as Type) as Object Implements IServiceProvider.GetService 
    End Sub 

End Class 

我掙扎將其轉換爲C#。我試過隱式訴明確,但我必須得到錯誤的語法。

回答

2

原來VB.NET方法是受保護的,所以我想這是相當於C#中的顯式接口實現:

class MyControl : Control, IServiceProvider 
{ 
    object IServiceProvider.GetService(Type t) 
    { 
     ... 
    } 
} 
+2

不等同於顯式實現,因爲您可以在VB.Net中引用「MyControl」來調用它。兩者之間的翻譯實際上只能用隱式和顯式實現的組合來表達。 – JaredPar 2010-10-01 15:48:45

+0

那是一個人的歡呼聲。我嘗試了一切,但是忽略了方法的名稱。 – Jules 2010-10-01 15:50:48

+0

@Jules:只要意識到這可能不會按照您希望的方式行事。有關詳細信息,請參閱JaredPar或我的回答... – 2010-10-01 15:56:07

7

你會做這樣的:

class MyControl : Control, IServiceProvider 
{ 
    // Explicitly implement this 
    object IServiceProvider.GetService(Type t) 
    { 
      // Call through to the protected version 
      return this.GetService(t); 
    } 

    // Override the protected version... 
    protected override object GetService(Type t) 
    { 
    } 
} 

話雖這麼說,控制已經實現的IServiceProvider(通過組件)。你真的可以這樣做:

class MyControl : Control 
{ 
    protected override object GetService(Type t) 
    { 
    } 
} 
+0

幹得好,打敗我t o it +1 – 2010-10-01 15:29:54

+2

這不起作用。它說該方法不能實現它,因爲它不公開。 – Jules 2010-10-01 15:38:17

+0

@Jules:對不起 - 太快了,忘了VB.NET中的一個祕密怪癖 - 我更新了,包括顯示它真的沒有必要在第一位... – 2010-10-01 15:45:51

4

VB.Net接口實現有一點問題需要在移植到C#時考慮。 VB.Net中實現的接口方法基本上在同一行中使用隱式和顯式接口實現。這允許像不匹配名稱和非公開實現的情況。

比如下面也是IServiceProvider

Class Example 
    Implements IServiceProvider 

    Private Sub GetServiceWrongName(t As Type) As Object Implements IServiceProvider.GetService 
    ... 
    End Sub 
End Class 

法律實施這相當於大約下面的C#代碼

class Example : IServiceProvider { 
    public object GetServiceWrongName(t as Type) { 
    .. 
    } 

    object IServiceProvider.GetService(t as Type) { 
    return GetServiceWrongName(t); 
    } 

} 
+0

它是以這種方式實現它還是明確實現接口?我認爲這是後者...... – 2010-10-01 15:47:30

+1

@Reed,它實際上產生的代碼在C#中完全不能代表。它生成一個具有IL操作碼的單一方法,將其指定爲「IServiceProvider.GetService」的覆蓋。我發現以我的例子爲例,編譯它並查看反射器中的IL轉儲是有益的。在C#中獲得等效代碼的唯一方法是(非公開的,不同的名稱等),這是兩種方法。 – JaredPar 2010-10-01 15:51:18

+0

非常有趣。謝謝。 – 2010-10-01 15:56:48