ものがたり(旧)

atsushieno.hatenablog.com に続く

XPathAtomicValue

うーん、意外とこれがめんどくさい。こいつはprimitive typeの値またはobjectと、XmlSchemaTypeの2つを引数にして生成される。しかもValueAsXXXなんていうプロパティがある。だから文字列とxs:intのXmlSchemaSimpleTypeでインスタンスを生成して、ValueAsBooleanなんて呼び出しも出来てしまう。

さらにはオブジェクト型の引数もあって、これはもうやりたい放題。ValueAsXXXを取得しようとすると、InvalidCastExceptionになるのだけど(大抵の場合。全てではないようだ)、XmlDocumentやXmlSchemaなんかで生成してもエラーにはならない。何の役にも立たないけど。

今のところ分かっているのは、ICollectionだかIEnumerableだかを渡しても、1つだけ内容を保持するものであればValueAsXXX(ValueAsList以外)はエラーにならないことと(1つだけエントリをもっているようなHashtableでさえOKなのだ)、objectがXPathAtomicValueであれば、その内容がそのまま流用されるということだ(ちなみにXPathNavigatorを渡してもNGだったので、要は単なるコピーコンストラクタなのだろう)。他にも隠し技があるのかもしれないが、いかんせんobject型の引数なので、気が付いたものを試すしかない。

ひとつ言えることは、これがXQuery実装における型操作をまともに使えるようにするための必要条件であって、しかも十分条件ではないということだ。もうちょっと使えるAPIにしてほしいなぁ…って、冷静に考えたらMS.Internal.Xml.*で「公開」されてるか…。