Возможно, вы захотите попробовать инструмент XPath Visualizer, чтобы помочь вам.
XPathVisualizer является бесплатным, простым в использовании.
ВАЖНО: Если вы используете Windows 7/8 и не видите пункты меню «Файл», «Редактировать» и «Справка», нажмите клавишу ALT.
Нет, анонимные типы не могут реализовать интерфейс. От руководство по программированию C# :
Анонимные типы являются типами классов, которые состоят из одного или нескольких общедоступных свойств только для чтения. Никакие другие виды участников класса, такие как методы или события не позволяются. Анонимный тип не может быть брошен ни к какому интерфейсу или типу за исключением объекта.
Нет; анонимный тип не может быть сделан сделать, что-либо кроме имеет несколько свойств. Необходимо будет создать собственный тип. Я не прочитал связанную статью подробно, но похоже, что это использует Отражение. Испустите для создания новых типов на лету; но если Вы ограничиваете обсуждение вещами в самом C# , Вы не можете сделать то, что Вы хотите.
Кастинг анонимных типов к интерфейсам был чем-то, что я хотел некоторое время, но к сожалению текущая реализация вынуждает Вас иметь реализацию того интерфейса.
лучшее решение вокруг этого имеет некоторый тип динамического прокси, который создает реализацию для Вас. Используя превосходное проект 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>();
Лучшее решение не состоит в том, чтобы просто использовать анонимные классы.
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);
}
}
}
Примечание, что необходимо бросить результат запроса к типу интерфейса. Мог бы быть лучший способ сделать это, но я не мог найти его.
Хорошо технически это не может быть сделано, поскольку анонимные типы определением содержат только общественные собственности. Я не знаю, в котором сценарии необходимо реализовать интерфейс, если Вы хотите сделать это, обычно создают. Может быть некоторая работа arounds как создание делегатов, но Вы не должны смущать пользователя. Не делайте комплекса Ваш код и сохраняйте его простым.