今再び私は辞書についての私の熱意の一つを説明しています!この質問は、私の 前の質問 !!の答えから思い浮かびます。
実際のポイントはですクラスを辞書に変換できますか?
辞書では、クラスプロパティを[〜#〜] key [〜#〜]として、特定のプロパティの値を[〜#〜] valueとして使用します[〜#〜]
私のクラスが
public class Location
{
public string city { get; set; }
public string state { get; set; }
public string country { get; set;
}
今、私のデータが
city = Delhi
state = Delhi
country = India
これで私のポイントを簡単に理解できます!
辞書を作りたい!その辞書は
Dictionary<string,string> dix = new Dictionary<string,string> ();
dix.add("property_name", "property_value");
値を取得できます!しかし、プロパティ名(ではなく値)を取得するにはどうすればよいですか?
それを動的に作成するには何をコーディングする必要があります!それは私が欲しいすべてのクラスで動作するはずです?
この質問は次のように理解できます
特定のクラスからプロパティのリストを取得するにはどうすればよいですか?
Linqを使用しない反射の例を次に示します。
Location local = new Location();
local.city = "Lisbon";
local.country = "Portugal";
local.state = "None";
PropertyInfo[] infos = local.GetType().GetProperties();
Dictionary<string,string> dix = new Dictionary<string,string> ();
foreach (PropertyInfo info in infos)
{
dix.Add(info.Name, info.GetValue(local, null).ToString());
}
foreach (string key in dix.Keys)
{
Console.WriteLine("nameProperty: {0}; value: {1}", key, dix[key]);
}
Console.Read();
JTokenを使用して、リフレクションの代替を追加したいと思います。どちらがパフォーマンスが優れているかを確認するには、2つのベンチマークの違いを確認する必要があります。
var location = new Location() { City = "London" };
var locationToken = JToken.FromObject(location);
var locationObject = locationObject.Value<JObject>();
var locationPropertyList = locationObject.Properties()
.Select(x => new KeyValuePair<string, string>(x.Name, x.Value.ToString()));
このメソッドは、フラットなクラス構造に最適であることに注意してください。
これを試してみてください。
public static Dictionary<string, object> ObjectToDictionary(object obj)
{
Dictionary<string, object> ret = new Dictionary<string, object>();
foreach (PropertyInfo prop in obj.GetType().GetProperties())
{
string propName = prop.Name;
var val = obj.GetType().GetProperty(propName).GetValue(obj, null);
if (val != null)
{
ret.Add(propName, val.ToString());
}
else
{
ret.Add(propName, null);
}
}
return ret;
}
protected string getExamTimeBlock(object dataItem)
{
var dt = ((System.Collections.Specialized.StringDictionary)(dataItem));
if (SPContext.Current.Web.CurrencyLocaleID == 1033) return dt["en"];
else return dt["sv"];
}