Почему компилятор C# вставляет явную реализацию интерфейса?C#

Место общения программистов C#
Anonymous
Почему компилятор C# вставляет явную реализацию интерфейса?

Сообщение Anonymous »

Я столкнулся со странным пограничным случаем C# и ищу хорошее решение.

Есть класс, который я не контролирую, который выглядит следующим образом:

Код: Выделить всё

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" для вывода, подразумевающего дополнительный кадр стека.

Причина в том, что под прикрытием компилятор C# меняет "ClassIDoControl" ", чтобы выглядеть так:

Код: Выделить всё

class ClassIDoControl : OtherCompany.ClassIDoNotControl, IInterfaceIDoControl
{
void IInterfaceIDoControl.SomeMethod(string argument)
{
base.SomeMethod(argument);
}
}
Есть ли способ избежать этого дополнительного уровня косвенности, генерируемого компилятором, с явно реализованными интерфейсами?

Подробнее здесь: https://stackoverflow.com/questions/366 ... ementation

Вернуться в «C#»