27

「 object 」タイプのオブジェクト(.NET)があります。実行時にその背後にある「実際の型(クラス) 」はわかりませんが、オブジェクトには「文字列名」というプロパティがあることはわかっています。「名前」の値を取得するにはどうすればよいですか?これは可能ですか?

このようなもの:

object item = AnyFunction(....);
string value = item.name;
4

7 に答える 7

60

リフレクションを使用する

System.Reflection.PropertyInfo pi = item.GetType().GetProperty("name");
String name = (String)(pi.GetValue(item, null));
于 2012-07-09T12:49:51.463 に答える
57

あなたはdynamic代わりにそれを使うことができますobject

dynamic item = AnyFunction(....);
string value = item.name;

動的言語ランタイム(DLR)にはキャッシュメカニズムが組み込まれているため、後続の呼び出しは非常に高速であることに注意してください。

于 2012-07-09T12:49:31.680 に答える
5

リフレクションと動的な値へのアクセスは、この質問に対する正しい解決策ですが、非常に低速です。より高速なものが必要な場合は、式を使用して動的メソッドを作成できます。

  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);

作成した関数をキャッシュすると、この方法の方が高速です。たとえば、辞書では、プロパティ名が変更されていない、またはタイプとプロパティ名の組み合わせが想定されている場合、キーはオブジェクトの実際のタイプになります。

于 2012-07-09T13:02:34.317 に答える
5

リフレクションはあなたを助けることができます。

var someObject;
var propertyName = "PropertyWhichValueYouWantToKnow";
var propertyName = someObject.GetType().GetProperty(propertyName).GetValue(someObject, null);
于 2012-07-09T12:52:20.740 に答える
1

場合によっては、Reflectionが正しく機能しないことがあります。

すべてのアイテムタイプが同じである場合は、辞書を使用できます。たとえば、アイテムが文字列の場合:

Dictionary<string, string> response = JsonConvert.DeserializeObject<Dictionary<string, string>>(item);

またはints:

Dictionary<string, int> response = JsonConvert.DeserializeObject<Dictionary<string, int>>(item);
于 2018-09-28T16:03:38.853 に答える
1

オブジェクトの代わりに動的を使用してそれを行うことができます:

dynamic item = AnyFunction(....);
string value = item["name"].Value;
于 2021-04-28T09:04:33.937 に答える
0

オブジェクトのすべてのプロパティに対してこれを試してください。

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に変換するために使用するカスタム関数です。

于 2015-08-29T10:10:10.687 に答える