[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をさまざまな方法で作成しています(1つは明示的にコメントアウトされています)。もう1つは、XElementを返すExpandoToMessageEvent(ExpandoObject)を使用しています。ここ は、私にとっては謎です:ダイナミックオーバーロード解決で拡張メソッド候補が考慮されないのはなぜですか?
- 私はCLRがXPathEvaluateはXElementオブジェクトに定義されていないと文句を言いたXEvent VARとするXEventを宣言した場合。確かにそうではありません。その拡張メソッド。
- スニペットの現在の動作(つまり、xEventはXElementとして宣言されています)、正常に動作します。
- 「動的」で始まり、現在コメントアウトされているセクションをExpandoToMessageEventメソッドの呼び出しの最後に置き換えた場合、CLRは満足しています。
明らかに、私はそれを動作させることができます。しかし、問題は:なぜ動的な言葉がCLRをスローするのでしょうか?
私は新しいExpandoObject()を関数に渡し、次に "var xEvent = ExpandoToMessageConverter.ExpandoToMessageEvent(new ExpandoObject())"のxEventの型を渡すと、 "が正しく決定され、CLRは満足しています。しかし、 "dynamic blah = new ExpandoObject()"と "var xEvent = ExpandoToMessageEvent(blah)"と言うと、xEventの型は正しくはわかりません(CLRはXElementの拡張メソッドを考慮していないようです)。
ExpandoToMessageEventメソッドのシグニチャはどのように見えますか? – Groo
... ExpandoToMessageEvent(ExpandoObject)、XElementを返します...そのポストで... – AlexeiOst