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

Использовать анонимный тип для интерфейса?

Это не представляется возможным? Итак, какова лучшая работа? Expando/dynamic?

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

...

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

ref:

4b9b3361

Ответ 1

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

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

 var myInterface =  new { x = 44, y = 55 }.ActLike<ICoOrd>();

Ответ 2

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

Ответ 3

Я знаю, что это старый вопрос и ответы, но я наткнулся на это, глядя на то, чтобы сделать то же самое для некоторых модульных тестов. Затем я подумал, что я уже делаю что-то подобное с помощью 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
}