在C#中获取特定对象属性的值,而不知道其背后的类

在C#中获取特定对象属性的值,而不知道其背后的类,c#,.net,C#,.net,我有一个类型为“object”的对象(.NET)。我不知道运行时它后面的“实类型(类)”,但我知道,该对象有一个属性“字符串名”。如何检索“name”的值?这可能吗 大概是这样的: object item = AnyFunction(....); string value = item.name; 您可以使用而不是对象: dynamic item = AnyFunction(....); string value = item.name; 请注意,(DLR)具有内置缓存机制,因此后续调用速度

我有一个类型为“object”的对象(.NET)。我不知道运行时它后面的“实类型(类)”,但我知道,该对象有一个属性“字符串名”。如何检索“name”的值?这可能吗

大概是这样的:

object item = AnyFunction(....);
string value = item.name;
您可以使用而不是
对象

dynamic item = AnyFunction(....);
string value = item.name;
请注意,(DLR)具有内置缓存机制,因此后续调用速度非常快。

使用反射

System.Reflection.PropertyInfo pi = item.GetType().GetProperty("name");
String name = (String)(pi.GetValue(item, null));

反思可以帮助你

var someObject;
var propertyName = "PropertyWhichValueYouWantToKnow";
var propertyName = someObject.GetType().GetProperty(propertyName).GetValue(someObject, 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);
objectvalue=GetValue();
字符串propertyName=“MyProperty”;
var参数=Expression.parameter(typeof(object));
var cast=Expression.Convert(参数,value.GetType());
var propertyGetter=Expression.Property(cast,propertyName);
var castResult=Expression.Convert(propertyGetter,typeof(object))//拳击
var propertyRetriver=Expression.Lambda(castResult,parameter).Compile();
var RetrievedPropertyValue=PropertyRetriever(值);

如果缓存创建的函数,这种方法会更快。例如,在dictionary中,假设属性名称不变,或者类型和属性名称的某种组合,则key将是对象的实际类型

只需对对象的所有属性尝试此操作

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

注意:函数。convertNullableToString()是用于将NULL值转换为string.empty的自定义函数。

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

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

Dictionary<string, string> response = JsonConvert.DeserializeObject<Dictionary<string, string>>(item);
Dictionary response=JsonConvert.DeserializeObject(项);
或ints:

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

您可以使用动态而不是对象:

dynamic item = AnyFunction(....);
string value = item["name"].Value;

GetValue(item,“PropertyName”)您可以使用
System.Reflection
获取对象类型,然后创建此类型的新变量,使其等于item,然后访问属性-您控制AnyFunction吗?为什么不在这里使用接口?并让任何函数返回IHasName或其他东西。请给“动态”一个链接。谢谢