Возможно ли сделать анонимный класс наследовать другой класс?
Это длинный снимок, но у меня есть странная ситуация с кодированием, когда я хочу возможность создавать анонимные классы "на лету", но иметь возможность передавать их как параметр методу, ожидающему интерфейс или подкласс. Другими словами, я хотел бы сделать что-то вроде этого:
public class MyBase { ... }
public void Foo(MyBase something)
{
...
}
...
var q = db.SomeTable.Select(t =>
new : MyBase // yeah, I know I can't do this...
{
t.Field1,
t.Field2,
});
foreach (var item in q)
Foo(item);
Есть ли способ сделать это иначе, чем использовать именованный класс?
Ответы
Ответ 1
Нет. Анонимные типы всегда неявно выводятся из object
и никогда не реализуют никаких интерфейсов.
Из раздела 7.6.10.6 спецификаций С# 5:
Анонимный инициализатор объекта объявляет анонимный тип и возвращает экземпляр этого типа. Анонимный тип - это безымянный тип класса, который наследуется непосредственно из object
.
Итак, если вам нужен другой базовый класс или вы хотите реализовать интерфейс, вам нужен именованный тип.
Ответ 2
Нет. Из документации:
Анонимные типы - это типы классов, которые производятся непосредственно из объекта и не могут быть добавлены к любому типу, кроме объекта.
Чтобы решить вашу проблему, просто замените анонимный тип обычным классом...
Ответ 3
Невозможно расширить анонимность, но вы можете объявить свой метод для принятия динамического параметра, если вам действительно нужно это работать.
Ответ 4
Краткий ответ: нет
Длинный ответ:
Вы можете использовать прокси-класс С#. Есть несколько инструментов, которые могут прокси-классы. Например Мок. https://github.com/moq/moq4