2016-06-27 9 views
1

私は受け取ったクラスのPropertyInfoに依存してリフレクション作業をしているライブラリを持っています(値を取得および設定するために)。動的オブジェクトのPropertyInfoを取得する

今、私は動的オブジェクトで作業することができますが、動的プロパティのPropertyInfoを取得する方法が見つかりません。私は代替案をチェックしましたが、私はどこでも変更する必要があるため、PropertyInfoを使って値を取得/設定します。

dynamic entity = new ExpandoObject(); 
entity.MyID = 1; 

// - Always null 
PropertyInfo p = entity.GetType().GetProperty("MyID"); 
// - Always null 
PropertyInfo[] ps = entity.GetType().GetProperties(); 

// - These are called everywhere in the code 
object value = p.GetValue(entity); 
p.SetValue(entity, value); 

それはちょうどそれが動的オブジェクトのGetValue()SetValue()だ使用できるように何とかPropertyInfoを取得または作成することは可能ですか?

+1

私はこれを再現できません。プロパティMyIDがエンティティに存在し、公開されていることは確かですか? –

+0

@DavidL申し訳ありませんが、より良い例を掲載します。それは動的なので、プロパティが設定され、公開されている場合にのみプロパティが存在します。 – Danicco

+0

実際のプロパティではない可能性があります。ランタイムバインディングを名前/値の辞書にリダイレクトすることによって、 'ExpandoObject' _simulate_プロパティのようなタイプもあります。 –

答えて

0

カバーの下にExpandoObjectは本当に単なる辞書です。あなたはそれをキャストするだけで辞書に入ることができます。

dynamic entity = new ExpandoObject(); 
entity.MyID = 1; 

if(entity.GetType() == typeof(ExpandoObject)) 
{ 
    Console.WriteLine("I'm dynamic, use the dictionary"); 
    var dictionary = (IDictionary<string, object>)entity; 
} 
else 
{ 
    Console.WriteLine("Not dynamic, use reflection"); 
} 

あなたは、渡されるオブジェクトは、その辞書のキーの上にただ反復する別のパスを使用したダイナミックかつルートであるかどうかを確認するためにあなたのMapping方法を変更することができます。

https://dotnetfiddle.net/VQQZdy

+0

私は避けようとしています辞書は、 'PropertyInfo'を前提とするコード内のすべての場所を変更する必要があります。 – Danicco

関連する問題