web-dev-qa-db-ja.com

C#でオブジェクトのプロパティ(文字列)を列挙する

私には多くのオブジェクトがあり、それらには多くの文字列プロパティがあるとしましょう。

それらを通過してプロパティ名とその値を出力するプログラム的な方法はありますか、それともハードコーディングする必要がありますか?

'string'タイプのオブジェクトのプロパティをクエリして出力するLINQ方法はありますか?

エコーしたいプロパティ名をハードコーディングする必要がありますか?

42
Matt

リフレクションを使用します。ハードコードされたプロパティアクセスほど高速ではありませんが、望みどおりの動作をします。

次のクエリは、オブジェクト 'myObject'の文字列型プロパティごとにNameプロパティとValueプロパティを持つ匿名型を生成します。

var stringPropertyNamesAndValues = myObject.GetType()
    .GetProperties()
    .Where(pi => pi.PropertyType == typeof(string) && pi.GetGetMethod() != null)
    .Select(pi => new 
    {
        Name = pi.Name,
        Value = pi.GetGetMethod().Invoke(myObject, null)
    });

使用法:

foreach (var pair in stringPropertyNamesAndValues)
{
    Console.WriteLine("Name: {0}", pair.Name);
    Console.WriteLine("Value: {0}", pair.Value);
}
78
Ben M

GetPropertiesメソッドを使用して、型のすべてのプロパティを取得できます。次に、LINQ Where拡張メソッドを使用してこのリストをフィルター処理できます。最後に、LINQ Select拡張メソッドまたはToDictionaryのような便利なショートカットを使用して、プロパティを投影できます。

列挙をStringタイプのプロパティに制限する場合は、次のコードを使用できます。

IDictionary<String, String> dictionary = myObject.GetType()
  .GetProperties()
  .Where(p => p.CanRead && p.PropertyType == typeof(String))
  .ToDictionary(p => p.Name, p => (String) p.GetValue(myObject, null));

これにより、プロパティ名をプロパティ値にマップする辞書が作成されます。プロパティタイプはStringに制限されているため、プロパティ値をStringにキャストしても安全であり、返されるタイプのタイプはIDictionary<String, String>

代わりにすべてのプロパティが必要な場合は、次のようにすることができます。

IDictionary<String, Object> dictionary = myObject.GetType()
  .GetProperties()
  .Where(p => p.CanRead)
  .ToDictionary(p => p.Name, p => p.GetValue(myObject, null));
14

オブジェクトのプロパティに格納されているデータを人間が読める形式で出力するだけの場合は、オブジェクトをJSON形式にシリアル化することをお勧めします。

using System.Web.Script.Serialization;
//...

string output = new JavaScriptSerializer().Serialize(myObject);
3
Karl Wenzel

リフレクションを使用してこれを行うことができます..。 CodeGur にはまともな記事がありますが、それはあなたが探している以上のものかもしれません...あなたはそれから学び、それをあなたのニーズに合わせてトリミングすることができます。

3
Michael Bray