私には多くのオブジェクトがあり、それらには多くの文字列プロパティがあるとしましょう。
それらを通過してプロパティ名とその値を出力するプログラム的な方法はありますか、それともハードコーディングする必要がありますか?
'string'タイプのオブジェクトのプロパティをクエリして出力するLINQ方法はありますか?
エコーしたいプロパティ名をハードコーディングする必要がありますか?
リフレクションを使用します。ハードコードされたプロパティアクセスほど高速ではありませんが、望みどおりの動作をします。
次のクエリは、オブジェクト '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);
}
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));
オブジェクトのプロパティに格納されているデータを人間が読める形式で出力するだけの場合は、オブジェクトをJSON形式にシリアル化することをお勧めします。
using System.Web.Script.Serialization;
//...
string output = new JavaScriptSerializer().Serialize(myObject);
リフレクションを使用してこれを行うことができます..。 CodeGur にはまともな記事がありますが、それはあなたが探している以上のものかもしれません...あなたはそれから学び、それをあなたのニーズに合わせてトリミングすることができます。