「 object 」タイプのオブジェクト(.NET)があります。実行時にその背後にある「実際の型(クラス) 」はわかりませんが、オブジェクトには「文字列名」というプロパティがあることはわかっています。「名前」の値を取得するにはどうすればよいですか?これは可能ですか?
このようなもの:
object item = AnyFunction(....);
string value = item.name;
リフレクションを使用する
System.Reflection.PropertyInfo pi = item.GetType().GetProperty("name");
String name = (String)(pi.GetValue(item, null));
リフレクションと動的な値へのアクセスは、この質問に対する正しい解決策ですが、非常に低速です。より高速なものが必要な場合は、式を使用して動的メソッドを作成できます。
object value = GetValue();
string propertyName = "MyProperty";
var parameter = Expression.Parameter(typeof(object));
var cast = Expression.Convert(parameter, value.GetType());
var propertyGetter = Expression.Property(cast, propertyName);
var castResult = Expression.Convert(propertyGetter, typeof(object));//for boxing
var propertyRetriver = Expression.Lambda<Func<object, object>>(castResult, parameter).Compile();
var retrivedPropertyValue = propertyRetriver(value);
作成した関数をキャッシュすると、この方法の方が高速です。たとえば、辞書では、プロパティ名が変更されていない、またはタイプとプロパティ名の組み合わせが想定されている場合、キーはオブジェクトの実際のタイプになります。
リフレクションはあなたを助けることができます。
var someObject;
var propertyName = "PropertyWhichValueYouWantToKnow";
var propertyName = someObject.GetType().GetProperty(propertyName).GetValue(someObject, null);
場合によっては、Reflectionが正しく機能しないことがあります。
すべてのアイテムタイプが同じである場合は、辞書を使用できます。たとえば、アイテムが文字列の場合:
Dictionary<string, string> response = JsonConvert.DeserializeObject<Dictionary<string, string>>(item);
またはints:
Dictionary<string, int> response = JsonConvert.DeserializeObject<Dictionary<string, int>>(item);
オブジェクトの代わりに動的を使用してそれを行うことができます:
dynamic item = AnyFunction(....);
string value = item["name"].Value;
オブジェクトのすべてのプロパティに対してこれを試してください。
foreach (var prop in myobject.GetType().GetProperties(BindingFlags.Public|BindingFlags.Instance))
{
var propertyName = prop.Name;
var propertyValue = myobject.GetType().GetProperty(propertyName).GetValue(myobject, null);
//Debug.Print(prop.Name);
//Debug.Print(Functions.convertNullableToString(propertyValue));
Debug.Print(string.Format("Property Name={0} , Value={1}", prop.Name, Functions.convertNullableToString(propertyValue)));
}
注:Functions.convertNullableToString()は、NULL値をstring.emptyに変換するために使用するカスタム関数です。