考慮すべきシナリオがいくつかあります。まず、オブジェクトのタイプを確認する必要があります。このためには、GetType()を呼び出すだけです。型がIDynamicMetaObjectProviderを実装していない場合は、他のオブジェクトと同じようにリフレクションを使用できます。何かのようなもの:
var propertyInfo = test.GetType().GetProperties();
ただし、IDynamicMetaObjectProvider実装の場合、単純なリフレクションは機能しません。基本的に、あなたはこのオブジェクトについてもっと知る必要があります。それがExpandoObject(IDynamicMetaObjectProvider実装の1つ)の場合は、itowlsonによって提供される回答を使用できます。ExpandoObjectはそのプロパティをディクショナリに格納し、動的オブジェクトをディクショナリにキャストするだけです。
DynamicObject(別のIDynamicMetaObjectProvider実装)の場合、このDynamicObjectが公開するメソッドを使用する必要があります。DynamicObjectは、プロパティのリストをどこかに実際に「保存」する必要はありません。たとえば、次のようなことが行われる場合があります(ブログの投稿の例を再利用しています)。
public class SampleObject : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = binder.Name;
return true;
}
}
この場合、任意の名前でプロパティにアクセスしようとすると、オブジェクトはプロパティの名前を文字列として返すだけです。
dynamic obj = new SampleObject();
Console.WriteLine(obj.SampleProperty);
//Prints "SampleProperty".
したがって、反映するものは何もありません。このオブジェクトにはプロパティがなく、同時にすべての有効なプロパティ名が機能します。
IDynamicMetaObjectProvider実装の場合、ExpandoObjectなどのプロパティのリストを取得できる既知の実装でフィルタリングし、残りの部分は無視(または例外をスロー)する必要があります。