[TestFixture]
public class ExpandoToMessageConverterTests
{
/// <summary>
/// CanConvertEvent
/// </summary>
[Test]
public void CanConvertEvent()
{
dynamic expandoEvent = new ExpandoObject();
expandoEvent.PropertyOne = "pROPERTYoNE";
expandoEvent.PropertyTow = "pROPERTYtWO";
XElement xEvent=ExpandoToMessageConverter.ExpandoToMessageEvent(expandoEvent);
/*var xEvent = new XElement("event",
new XElement("properties",
new XElement("property",
new XAttribute("name", "pROPERTYoNE"),
new XAttribute("value", "someVal")),
new XElement("property",
new XAttribute("name", "pROPERTYtWO"),
new XAttribute("value", "BLAH"))));*/
Assert.IsNotNull(xEvent);
var properties = new List<XElement>(xEvent.Descendants("properties"));
Assert.AreEqual(1,properties.Count);
var value = ((IEnumerable)xEvent.XPathEvaluate("properties/property")).Cast<XElement>();
Assert.AreEqual(2, value.Count());
}
В приведенном выше коде я создаю один и тот же XML по-разному (один, явный, закомментирован). Другой использует ExpandoToMessageEvent (ExpandoObject), который возвращает XElement. Вот для меня загадка:Почему динамическое разрешение перегрузки не рассматривается кандидатами метода расширения?
- если я объявляю xEvent, как вар xEvent СЬК жалуется, что XPathEvaluate не определено на XElement. Это не так; его метод расширения.
- способ, которым теперь является фрагмент (т. Е. XEvent, объявленный как XElement), он отлично работает.
- Если я заменил раздел, начинающийся с «dynamic» и заканчивающийся в конце вызова моего метода ExpandoToMessageEvent с разделом, который в настоящее время прокомментирован, CLR счастлив.
Очевидно, что я могу заставить его работать. Но возникает вопрос: почему «динамическое» слово отбрасывает CLR?
я решил проверить еще пару вещей, и вот что я нашел: Если я пройти новую ExpandoObject() функции, то тип xEvent в «вар xEvent = ExpandoToMessageConverter.ExpandoToMessageEvent (новый ExpandoObject()) "определяется правильно, и CLR счастлив. Однако, если я скажу «dynamic blah = new ExpandoObject()», а затем «var xEvent = ExpandoToMessageEvent (blah)», тип xEvent не определен правильно (я думаю), и CLR, похоже, не рассматривает методы расширения для XElement.
Как выглядит подпись для метода ExpandoToMessageEvent? – Groo
... ExpandoToMessageEvent (ExpandoObject), который возвращает XElement ... Его в столбце ... – AlexeiOst