Я строю тип во время выполнения, используя Reflection.Emit
.Конечный пользователь предоставляет базовый тип и какие интерфейсы должен поддерживать новый тип.Если в интерфейсе есть члены, которые базовый тип не может поддерживать, я создаю метод-заглушку, который вызывает делегат, хранящийся в статическом поле (я поддерживаю только неуниверсальные методы с 15 или менее параметрами, без параметров ref или out, поскольку это мой текущийтребования. Пожалуйста, не поднимайте проблемы с этим ограничением. Делегат принимает первый параметр baseType), который пользователь может предоставить, прежде чем пытаться создать тип.
Однако я бы хотел избежать созданиязаглушки делегатов для членов интерфейса, которые могут быть удовлетворены типом.например,
public class Goose
{
public void Quack()
{
// quack implementation details go here.
}
}
public interface IDuck
{
void Quack()
}
Мне бы хотелось, чтобы, если вы отправили сюда Goose
с new[]{typeof(IDuck)}
моему строителю, я не буду создавать заглушку для void Quack()
, поскольку гусь удовлетворяет интерфейсу.
Сопоставление интерфейса не работает, поскольку Goose не реализует IDuck, и я не могу попросить вновь созданный тип для сопоставления интерфейса, поскольку TypeBuilder
не поддерживает его для типов, которые должны бытьпостроенный.
Как я могу решить это способом, который является удаленно эффективным?Я должен только исследовать общедоступные члены, и если тип явно реализует интерфейс с тем же методом, я могу предположить, что он не должен использоваться в качестве цели.(Например, если Goose реализовал void IGoose.Quack()
, тогда он не должен считаться целью для void IDuck.Quack()
).(В любом случае, BindingFlags.Public | BindingFlags.Instance
должно быть достаточно, чтобы отфильтровать эти элементы).