今日、C#のダイナミクスを調べたところ、何かに驚きました(私はそれらをあまり使用していませんが、最近はNancy Webフレームワークを試しています)。私はこれを行うことができないことがわかりました:
dynamic expando = new ExpandoObject();
expando.name = "John";
Console.WriteLine(expando["name"]);
最後の行は例外をスローします:
タイプ[System.Dynamic.ExpandoObject]の式に[]を使用してインデックスを適用することはできません
エラーメッセージは理解できましたが、なぜこれが発生しているのかわかりません。 ExpandoObjectのドキュメントを確認しましたが、IDictionary<,>
を明示的に実装しているため、this.[index]
メソッドがあります( [〜#〜] msdn [〜#〜] )。なぜそれを呼び出せないのですか?
もちろん、ExpandoObject
を手動でディクショナリにダウンキャストしてインデックスを作成するのを止めることは何もありませんが、そのようなことは重要ではありません。また、Expandoがそのインターフェースの1つのメソッドをどのように非表示にできたかについても説明していません。
何が起きてる?
expandoがそのインターフェースの1つのメソッドをどのように隠すことができたか。
あなたがドキュメントで正しく見つけたように、 indexer isexplicit interface implementation です。 From Explicit Interface Implementation Tutorial :
インターフェイスを実装するクラスは、そのインターフェイスのメンバーを明示的に実装できます。メンバーが明示的に実装されている場合、クラスインスタンスを介してアクセスすることはできませんが、インターフェイスのインスタンスを介してのみアクセスできます。
これは、アクセスするためにインターフェースへの参照をキャストする必要があることを意味します:
((IDictionary<String, Object>)expando)["name"]