[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());
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我以不同的方式创建相同的xml(一个,显式,被注释掉).另一个是使用ExpandoToMessageEvent(ExpandoObject),它返回一个XElement.这对我来说是个谜:
显然,我可以让它发挥作用.但问题是:为什么'动态'一词会让CLR失效?
我决定检查更多的东西,这就是我发现的:如果我将新的ExpandoObject()传递给函数,那么"var xEvent = ExpandoToMessageConverter.ExpandoToMessageEvent(new ExpandoObject())"中的xEvent类型将被正确确定和CLR很高兴.但是,如果我说"dynamic blah = …