Por que o compilador C # insere uma implementação explícita da interface?
Encontrei um caso estranho de borda de C # e estou procurando uma boa solução alternativa.
Há uma classe que eu não controlo que se parece com isso:
namespace OtherCompany
{
public class ClassIDoNotControl
{
public void SomeMethod(string argument)
{
Console.WriteLine((new StackFrame(1).GetMethod().Name));
}
}
}
Eu gostaria de herdar desta classe em uma classe que euFaz ao controle. Além disso, gostaria de especificar uma interface:
interface IInterfaceIDoControl
{
void SomeMethod(string argument);
}
class ClassIDoControl : OtherCompany.ClassIDoNotControl, IInterfaceIDoControl
{
}
Se todos esses arquivos estiverem no mesmo assembly, tudo funcionará bem:
namespace MyCompany
{
class Program
{
static void Main(string[] args)
{
IInterfaceIDoControl i = new ClassIDoControl();
i.SomeMethod("Hello World!"); // Prints "Main"
}
}
}
Mas, se eu mover "ClassIDoNotControl" para outro assembly, não receberei o que esperava. Em vez disso, vejo "MyCompany.IInterfaceIDoControl.SomeMethod" para a saída, o que implica um quadro de pilha extra.
O motivo é que, nos bastidores, o compilador C # está alterando "ClassIDoControl" para ficar assim:
class ClassIDoControl : OtherCompany.ClassIDoNotControl, IInterfaceIDoControl
{
void IInterfaceIDoControl.SomeMethod(string argument)
{
base.SomeMethod(argument);
}
}
Existe uma maneira de evitar essa camada extra de indireção gerada pelo compilador com interfaces explicitamente implementadas?