Я столкнулся с странным случаем С# и искал хорошую работу.
Существует класс, который я не контролирую, который выглядит так:
namespace OtherCompany
{
public class ClassIDoNotControl
{
public void SomeMethod(string argument)
{
Console.WriteLine((new StackFrame(1).GetMethod().Name));
}
}
}
Я хотел бы наследовать этот класс в классе, который я контролирую. Кроме того, я хотел бы указать интерфейс на нем:
interface IInterfaceIDoControl
{
void SomeMethod(string argument);
}
class ClassIDoControl : OtherCompany.ClassIDoNotControl, IInterfaceIDoControl
{
}
Если все эти файлы находятся в одной сборке, все отлично работает:
namespace MyCompany
{
class Program
{
static void Main(string[] args)
{
IInterfaceIDoControl i = new ClassIDoControl();
i.SomeMethod("Hello World!"); // Prints "Main"
}
}
}
Но если я переведу "ClassIDoNotControl" в другую сборку, я не получу ожидаемого. Вместо этого я вижу "MyCompany.IInterfaceIDoControl.SomeMethod" для вывода, подразумевающего дополнительный стек стека.
Причина в том, что под обложками компилятор С# меняет "ClassIDoControl", чтобы выглядеть так:
class ClassIDoControl : OtherCompany.ClassIDoNotControl, IInterfaceIDoControl
{
void IInterfaceIDoControl.SomeMethod(string argument)
{
base.SomeMethod(argument);
}
}
Есть ли способ избежать этого дополнительного слоя косвенного применения компилятора с явно реализованными интерфейсами?