2017-12-01 5 views
2

少し不明瞭で、確かに強く型付けされたものがここで助けになりますが、私はこの問題を解決するために短時間でその贅沢品を買う余裕はありません。 オブジェクトクラスの型とプロパティと値を取得する

は、私はこの方法で持っていると言う:。

public static void MyMethod(string words, object params) 
{ 
    connection.Open(); 
    connection.Execute(words, params); 
} 

私は、実行時に、中に渡されるparamsプロパティと値をログに記録する方法を探していますが、私は見つけることができませんが、プロパティを取得することができます値を抽出する方法。私はリフレクションが使用されていると仮定しますが、オブジェクトが強く型付けされている場合にのみこれを行う方法を知っています。

私は前にこのアプローチを使用している
+0

事例がありますか? "object params"が私には奇妙に聞こえる... –

+0

インターセプタを作成するのに 'Unity.Interception'を使います。インターセプタを設定してこのメ​​ソッドを見ることができ、自由にパラメータを選ぶことができます。ただし、「static」キーワードを削除する必要があります。多くの静的メソッドを傍受したり、擬似または擬似的に扱うことはできません。 – code4life

+1

あなたはそれをログしているので、 '.ToString()'のすべての値を使うのではなく、すべての値をJSONに変換するのはなぜですか? –

答えて

0

- はExpando動的オブジェクトに変換するには、オブジェクトの拡張メソッド:

public static dynamic ToDynamic(this object value) 
{ 
    IDictionary<string, object> expando = new ExpandoObject(); 

    foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(value.GetType())) 
    expando.Add(property.Name, property.GetValue(value)); 

    return expando as ExpandoObject; 
} 

次にあなたがオブジェクトと対話するためのIDictionaryインターフェイスを使用して、正確にキー/値を知ることができますペア。

1

あなたは、この使用して反射を達成することができます(Loggerクラスは、独自の実装に基づいており、例の目的のためだけに使用されている):

public static void MyMethod(String words, Object obj) 
{ 
    if (obj == null) 
     throw new ArgumentNullException("obj"); 

    Type objType = obj.GetType(); 
    List<PropertyInfo> props = new List<PropertyInfo>(objType.GetProperties()); 

    Logger.Log(
     "Object of type '{0}' with properties:", 
     objType.ToString() 
    ); 

    foreach (PropertyInfo prop in props) 
    { 
     Logger.Log(" - {0} [Type = {1}] [Value = {2}]", 
      prop.Name, 
      prop.PropertyType, 
      prop.GetValue(this, null) 
     ); 
    } 

    connection.Open(); 
    connection.Execute(words, obj); 
} 

メインドキュメントの参照:

関連する問題