我有一个类型为“ object ”的对象(.NET)。在运行时我不知道它背后的“真实类型(类)”,但我知道,该对象具有属性“字符串名称”。我怎样才能追溯“名字”的价值?这可能吗?
类似的东西:
object item = AnyFunction(....);
string value = item.name;
答案 0 :(得分:39)
您可以使用dynamic
代替object
dynamic item = AnyFunction(....);
string value = item.name;
答案 1 :(得分:39)
使用反射
System.Reflection.PropertyInfo pi = item.GetType().GetProperty("name");
String name = (String)(pi.GetValue(item, null));
答案 2 :(得分:4)
反思可以帮助你。
var someObject;
var propertyName = "PropertyWhichValueYouWantToKnow";
var propertyName = someObject.GetType().GetProperty(propertyName).GetValue(someObject, null);
答案 3 :(得分:3)
反思和动态价值访问是这个问题的正确解决方案,但速度很慢。 如果你想要更快的东西,那么你可以使用表达式创建动态方法:
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);
如果缓存创建的函数,这种方式会更快。例如,在字典中,键是实际的对象类型,假设属性名称没有更改,或者类型和属性名称的某种组合。
答案 4 :(得分: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。
答案 5 :(得分:0)
在某些情况下,反射不能正常工作。
如果所有项目类型都相同,则可以使用词典。 例如,如果您的项目是字符串:
Dictionary<string, string> response = JsonConvert.DeserializeObject<Dictionary<string, string>>(item);
或整数:
Dictionary<string, int> response = JsonConvert.DeserializeObject<Dictionary<string, int>>(item);
答案 6 :(得分:0)
您可以使用动态代替对象来实现:
dynamic item = AnyFunction(....);
string value = item["name"].Value;