Это не представляется возможным? Итак, какова лучшая работа? Expando/dynamic?
public interface ICoOrd {
int x { get; set; }
int y { get; set; }
}
...
ICoOrd a = new {x = 44, y = 55};
ref:
Это не представляется возможным? Итак, какова лучшая работа? Expando/dynamic?
public interface ICoOrd {
int x { get; set; }
int y { get; set; }
}
...
ICoOrd a = new {x = 44, y = 55};
ref:
Лучшим "обходным решением" является создание и использование обычного, "именованного" типа, который реализует интерфейс.
Но если вы настаиваете на использовании анонимного типа, подумайте об использовании прокси-инфраструктуры динамического интерфейса, например ImpromptuInterface
.
var myInterface = new { x = 44, y = 55 }.ActLike<ICoOrd>();
Нет, анонимные типы никогда не реализуют интерфейсы. dynamic
также не позволит вам переходить в интерфейс, но позволит вам просто получить доступ к двум свойствам. Обратите внимание, что анонимные типы internal
, поэтому, если вы хотите использовать их в сборках с помощью dynamic
, вам нужно использовать InternalsVisibleTo
.
Я знаю, что это старый вопрос и ответы, но я наткнулся на это, глядя на то, чтобы сделать то же самое для некоторых модульных тестов. Затем я подумал, что я уже делаю что-то подобное с помощью 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
}