приведение анонимного типа к интерфейсу? - PullRequest
18 голосов
/ 12 февраля 2012

Это кажется невозможным? Так какой же лучший обходной путь? Expando / динамический?

public interface ICoOrd {
    int x { get; set; }
    int y { get; set; }
}      

...

ICoOrd a = new {x = 44, y = 55};

ref:

Ответы [ 3 ]

27 голосов
/ 12 февраля 2012

Лучший «обходной путь» - это создание и использование обычного «именованного» типа, реализующего интерфейс.

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

 var myInterface =  new { x = 44, y = 55 }.ActLike<ICoOrd>();
7 голосов
/ 12 февраля 2012

Нет, анонимные типы никогда не реализуют интерфейсы. dynamic не позволит вам привести к интерфейсу, но позволит позволить вам просто получить доступ к двум свойствам. Обратите внимание, что анонимными типами являются internal, поэтому если вы хотите использовать их в сборках, использующих dynamic, вам нужно будет использовать InternalsVisibleTo.

2 голосов
/ 23 сентября 2014

Я знаю, что это старый вопрос и ответы, но я наткнулся на это, пытаясь сделать то же самое для некоторых модульных тестов. Затем мне пришло в голову, что я уже делаю что-то подобное, используя Moq (facepalm).

Мне нравится другое предложение для ImpromptuInterface, но я уже использую Moq и чувствую, что у него больше подписчиков (то есть мнение и не факт), он будет более стабильным и дольше будет поддерживаться.

так что для этого случая было бы что-то вроде

public interface ICoOrd
{
    int X { get; set; }
    int Y { get; set; }
}

public class Sample
{

    public void Test()
    {
        var aCord = new Mock<ICoOrd>();
        aCord.SetupGet(c => c.X).Returns(44);
        aCord.SetupGet(c => c.Y).Returns(55);

        var a = aCord.Object;
    }
}

РЕДАКТИРОВАТЬ : просто добавив еще один способ издеваться над шнуром, начал делать это таким образом, и он немного лучше.

public void AnotherTest()
{
    var aCord = Mock.Of<ICoOrd>(c => c.X == 44 && c.Y == 55);
    //do stuff with aCord
}
...