Подтвердить что ты не робот

Возможно ли сделать анонимный класс наследовать другой класс?

Это длинный снимок, но у меня есть странная ситуация с кодированием, когда я хочу возможность создавать анонимные классы "на лету", но иметь возможность передавать их как параметр методу, ожидающему интерфейс или подкласс. Другими словами, я хотел бы сделать что-то вроде этого:

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);

Есть ли способ сделать это иначе, чем использовать именованный класс?

4b9b3361

Ответ 1

Нет. Анонимные типы всегда неявно выводятся из object и никогда не реализуют никаких интерфейсов.

Из раздела 7.6.10.6 спецификаций С# 5:

Анонимный инициализатор объекта объявляет анонимный тип и возвращает экземпляр этого типа. Анонимный тип - это безымянный тип класса, который наследуется непосредственно из object.

Итак, если вам нужен другой базовый класс или вы хотите реализовать интерфейс, вам нужен именованный тип.

Ответ 2

Нет. Из документации:

Анонимные типы - это типы классов, которые производятся непосредственно из объекта и не могут быть добавлены к любому типу, кроме объекта.

Чтобы решить вашу проблему, просто замените анонимный тип обычным классом...

Ответ 3

Невозможно расширить анонимность, но вы можете объявить свой метод для принятия динамического параметра, если вам действительно нужно это работать.

Ответ 4

Краткий ответ: нет

Длинный ответ: Вы можете использовать прокси-класс С#. Есть несколько инструментов, которые могут прокси-классы. Например Мок. https://github.com/moq/moq4