Почему компилятор 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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