C# 从vb.net到c的接口转换
我有一个覆盖受保护的GetService方法并将其分配给IServiceProvider接口的控件:C# 从vb.net到c的接口转换,c#,.net,vb.net,interface,C#,.net,Vb.net,Interface,我有一个覆盖受保护的GetService方法并将其分配给IServiceProvider接口的控件: Class MyControl Inherits Control Implements IServiceProvider Protected Overrides Sub GetService(t as Type) as Object Implements IServiceProvider.GetService End Sub End Class 我正在努力把
Class MyControl
Inherits Control
Implements IServiceProvider
Protected Overrides Sub GetService(t as Type) as Object Implements IServiceProvider.GetService
End Sub
End Class
我正在努力把它转换成c。我试过隐式v。显式,但我一定是弄错了语法。您可以这样做:
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)
{
}
}
您可以这样做:
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)
{
}
}
在移植到C时,需要考虑VB.Net接口实现的一些关键问题。VB.Net中实现的接口方法基本上在同一行中使用隐式和显式接口实现。这允许出现名称不匹配和非公共实现等情况 例如,以下也是IServiceProvider的合法实现 它大致转换为以下C代码
class Example : IServiceProvider {
public object GetServiceWrongName(t as Type) {
..
}
object IServiceProvider.GetService(t as Type) {
return GetServiceWrongName(t);
}
}
在移植到C时,需要考虑VB.Net接口实现的一些关键问题。VB.Net中实现的接口方法基本上在同一行中使用隐式和显式接口实现。这允许出现名称不匹配和非公共实现等情况 例如,以下也是IServiceProvider的合法实现 它大致转换为以下C代码
class Example : IServiceProvider {
public object GetServiceWrongName(t as Type) {
..
}
object IServiceProvider.GetService(t as Type) {
return GetServiceWrongName(t);
}
}
原来的VB.NET方法是受保护的,所以我想它相当于C中的显式接口实现:
class MyControl : Control, IServiceProvider
{
object IServiceProvider.GetService(Type t)
{
...
}
}
原来的VB.NET方法是受保护的,所以我想它相当于C中的显式接口实现:
class MyControl : Control, IServiceProvider
{
object IServiceProvider.GetService(Type t)
{
...
}
}
那不行。它说该方法无法实现它,因为它不是公共的。@Jules:很抱歉-太快了,并且忘记了VB.NET中的一个交互怪癖-我更新了,包括显示它在一开始确实没有必要…@Reed,您仍然不能在示例中使用protected,因为接口方法必须是公共的。也不能使用override,因为除非GetService实现也被标记为虚拟,否则您将得到一个“找不到合适的方法”来重写编译器错误。该方法应用于MyControl:Control案例。@Anthony:不正确。我在这里重写Component.GetService,它是受保护的虚拟服务。在我最初的混乱之后,我把它放进了一个编译器,以确保它能正常工作。请参阅:“里德,这将教我考虑实际对象被引用而不是泛泛而谈。”哎呀。但是,是的,如果控件或它的基实现了接口的明确性,并提供了一个具有类似名称的虚拟方法,那么代码确实可以工作。但这不起作用。它说该方法无法实现它,因为它不是公共的。@Jules:很抱歉-太快了,并且忘记了VB.NET中的一个交互怪癖-我更新了,包括显示它在一开始确实没有必要…@Reed,您仍然不能在示例中使用protected,因为接口方法必须是公共的。也不能使用override,因为除非GetService实现也被标记为虚拟,否则您将得到一个“找不到合适的方法”来重写编译器错误。该方法应用于MyControl:Control案例。@Anthony:不正确。我在这里重写Component.GetService,它是受保护的虚拟服务。在我最初的混乱之后,我把它放进了一个编译器,以确保它能正常工作。请参阅:“里德,这将教我考虑实际对象被引用而不是泛泛而谈。”哎呀。但是是的,如果控件或它的基显式地实现了接口,并提供了一个具有类似名称的虚拟方法,那么代码确实可以工作。它是这样实现的,还是显式地实现接口?我以为是后者…@Reed,它实际生成的代码根本无法用C表示。它生成一个方法,该方法具有将其指定为IServiceProvider.GetService覆盖的IL op代码。我发现以我的示例为例,编译它并在reflector中查看IL转储很有启发性。在C中获得等价代码的唯一方法是非公开、不同名称等。。。是两种方法的方法。它是这样实现的,还是显式地实现接口?我以为是后者…@Reed,它实际生成的代码根本无法用C表示。它生成一个方法,该方法具有将其指定为IServiceProvider.GetService覆盖的IL op代码。我发现以我的示例为例,编译它并在reflector中查看IL转储很有启发性。在C中获得等价代码的唯一方法是非公开、不同名称等。。。是两种方法的方法。不等同于显式实现,因为您可以从VB.Net中对MyControl的引用中调用它。这两者之间的转换实际上只能通过隐式和显式实现的结合来表达,这是值得欢呼的。我什么都试过了,但没有放弃
方法的名称。@Jules:请注意,这可能不会按您希望的方式进行。有关详细信息,请参见JaredPar或我的答案…不等同于显式实现,因为您可以在VB.Net中通过对MyControl的引用调用它。这两者之间的转换实际上只能通过隐式和显式实现的结合来表达,这是值得欢呼的。我什么都试过了,但没有提到方法的名称。@Jules:要知道,这可能不会像你希望的那样。有关详细信息,请参阅JaredPar或我的答案。。。