Я столкнулся со странным крайним случаем C # и ищу хороший обходной путь.
Существует класс, который я не контролирую, который выглядит следующим образом:
namespace OtherCompany
{
public class ClassIDoNotControl
{
public void SomeMethod(string argument)
{
Console.WriteLine((new StackFrame(1).GetMethod().Name));
}
}
}
Я бы хотел наследовать от этого класса в классе I do control. Кроме того, я хотел бы указать интерфейс на нем:
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» для вывода, подразумевающего дополнительный кадр стека.
Причина в том, что под прикрытием компилятор C # меняет "ClassIDoControl", чтобы он выглядел так:
class ClassIDoControl : OtherCompany.ClassIDoNotControl, IInterfaceIDoControl
{
void IInterfaceIDoControl.SomeMethod(string argument)
{
base.SomeMethod(argument);
}
}
Есть ли способ избежать этого сгенерированного компилятором дополнительного уровня косвенности с явно реализованными интерфейсами?