2010-10-01 4 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#. Я пробовал неявный v. Явный, но я должен получить синтаксис неправильно.

ответ

2

защищен оригинальный метод VB.NET, так что я предполагаю, что это эквивалент явной реализации интерфейса в C#:

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

Не эквивалентно явной реализации, потому что вы можете вызвать его из ссылки на MyControl в VB.Net. Перевод между этими двумя может действительно быть представлен только с помощью неявной и явной реализации. – JaredPar

+0

Thats the one cheers. Я попробовал все, но оставил имя метода. – Jules

+0

@Jules: Просто поймите, что это, вероятно, не будет вести себя так, как вы хотите, чтобы он себя вел. Подробнее см. JaredPar или мой ответ ... –

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

Хорошая работа, избили меня o it +1 –

+2

Это не работает. В нем говорится, что метод не может реализовать его, потому что он не является общедоступным. – Jules

+0

@Jules: Извините, что это было слишком быстро, и забыл об одном из любопытных причуд в VB.NET - я обновил, включая показ, что это действительно не нужно в первую очередь ... –

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

Осуществляет ли он это так или реализует интерфейс явно? Я думал, что это последний ... –

+1

@Reed, код, который он фактически производит, просто не представлен в C# вообще. Он генерирует единственный метод, который имеет коды op IL, которые указывают его как переопределение на 'IServiceProvider.GetService'. На мой взгляд, поучительно взять мой пример, скомпилировать его и просмотреть дамп IL в отражателе. Единственный способ получить эквивалентный код в C# (непубличные, разные имена и т. Д.) - это метод двух методов. – JaredPar

+0

Очень интересно. Благодарю. –

Смежные вопросы