5

ExpandoObject を PropertyGrid の SelectedObject として使用しようとしています。必要なプロパティを ExpandoObject に追加する方法を知っています。

public dynamic MakePropertyObject()
{
    dynamic expando = new ExpandoObject();
    var dictionary = expando as IDictionary<string, object>;
    foreach(MyClass m in PropertiesINeedToAdd)
        dictionary[m.Name] = m.Value;
    return expando;
}

このコードは正常に動作しています。デバッガーは、expandoのプロパティの名前と値を期待どおりに表示します。

MakePropertyObject()ただし、戻り値をそのプロパティに設定すると、生成されたプロパティはどれも PropertyGrid に表示されませんSelectedObject。これは、ExpandoObjectのプロパティDisplayNameAttributeに 、DescriptionAttribute、またはPropertyGrid.

私はいくつかの読書とグーグルをしましたがExpandoObject、カスタム属性で生成されたプロパティを装飾する方法があるかどうかわかりません。これを行う方法、または を に表示するより良い方法を知っている人はExpandoObjectPropertyGridますか?

解決:

@Stephen Cleary が提供した回答は正しく、役に立ちました (ありがとう、Stephen)。同じ問題を抱えている他の人にとって、実装ICustomTypeDescriptorは私にとって完璧に機能しました。

補足として、実装するオブジェクトICustomTypeDescriptorは、別のオブジェクトではなく、それ自体のプロパティとイベント記述子を提供します。最初は、記述子と記述されたものは属性または何かによってリンクされているはずだと思っていました-オブジェクトが独自のタイプを記述しなければならないことは混乱し、冗長に思えましたが、実際にはそれがインターフェイスPropertyGridの使用方法です。ICustomTypeDescriptor

4

1 に答える 1

7

問題は、実際にはリフレクションが動的型で期待どおりに機能しないことです。

PropertyGridリフレクションを使用してオブジェクトのプロパティを調べますExpandoObjectが、(静的) プロパティはありません。

ICustomTypeDescriptorリフレクションを「ハイジャック」し、 の (動的) プロパティをクエリするように実装できますExpandoObjectこのブログ投稿のコードはDynamicTypeDescriptorWrapper、出発点として適しています。

于 2011-04-23T23:31:06.680 に答える