27

我有一个“对象”类型的对象(.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);

如果您缓存创建的函数,这种方式会更快。例如,在字典中,假设属性名称未更改或类型和属性名称的某种组合,则 key 将是对象的实际类型。

于 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

在某些情况下,反射无法正常工作。

如果所有项目类型都相同,您可以使用字典。例如,如果您的项目是字符串:

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

或整数:

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 回答