Может ли анонимный класс C # реализовать интерфейс?

Возможно, вы захотите попробовать инструмент XPath Visualizer, чтобы помочь вам.

XPathVisualizer является бесплатным, простым в использовании.

ВАЖНО: Если вы используете Windows 7/8 и не видите пункты меню «Файл», «Редактировать» и «Справка», нажмите клавишу ALT.

426
задан Patrick McDonald 22 June 2009 в 16:16
поделиться

5 ответов

Нет, анонимные типы не могут реализовать интерфейс. От руководство по программированию C# :

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

332
ответ дан Kobi 22 June 2009 в 16:16
поделиться

Нет; анонимный тип не может быть сделан сделать, что-либо кроме имеет несколько свойств. Необходимо будет создать собственный тип. Я не прочитал связанную статью подробно, но похоже, что это использует Отражение. Испустите для создания новых типов на лету; но если Вы ограничиваете обсуждение вещами в самом C# , Вы не можете сделать то, что Вы хотите.

12
ответ дан Marc Gravell 22 June 2009 в 16:16
поделиться

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

лучшее решение вокруг этого имеет некоторый тип динамического прокси, который создает реализацию для Вас. Используя превосходное проект LinFu можно заменить

select new
{
  A = value.A,
  B = value.C + "_" + value.D
};

с

 select new DynamicObject(new
 {
   A = value.A,
   B = value.C + "_" + value.D
 }).CreateDuck<DummyInterface>();
42
ответ дан Stephen Kennedy 22 June 2009 в 16:16
поделиться

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

public class Test
{
    class DummyInterfaceImplementor : IDummyInterface
    {
        public string A { get; set; }
        public string B { get; set; }
    }

    public void WillThisWork()
    {
        var source = new DummySource[0];
        var values = from value in source
                     select new DummyInterfaceImplementor()
                     {
                         A = value.A,
                         B = value.C + "_" + value.D
                     };

        DoSomethingWithDummyInterface(values.Cast<IDummyInterface>());

    }

    public void DoSomethingWithDummyInterface(IEnumerable<IDummyInterface> values)
    {
        foreach (var value in values)
        {
            Console.WriteLine("A = '{0}', B = '{1}'", value.A, value.B);
        }
    }
}

Примечание, что необходимо бросить результат запроса к типу интерфейса. Мог бы быть лучший способ сделать это, но я не мог найти его.

11
ответ дан Doron Yaacoby 22 June 2009 в 16:16
поделиться

Хорошо технически это не может быть сделано, поскольку анонимные типы определением содержат только общественные собственности. Я не знаю, в котором сценарии необходимо реализовать интерфейс, если Вы хотите сделать это, обычно создают. Может быть некоторая работа arounds как создание делегатов, но Вы не должны смущать пользователя. Не делайте комплекса Ваш код и сохраняйте его простым.

0
ответ дан 22 November 2019 в 23:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: