我想获得动态对象的动态属性的值。 这是我的代码..
public string ReturnProperty(object ob, string prop)
{
Type type = ob.GetType();
PropertyInfo pr = type.GetProperty(prop);
//Here pr is null..Dont know whats wrong
return pr.GetValue(ob, null).ToString();
}
答案 0 :(得分:29)
我的猜测是,它既不是公共财产,也不是你的名字错了,或者根本不是财产(只是公共领域)。
如果不知道实际的类型是什么,就不可能多说,但这应该是一个开始。
你提到这是一个“动态对象”,但这并不是非常具有描述性。请记住,CLR本身对DLR一无所知 - 如果您的意思是这是一种实现IDynamicMetaObjectProvider
或扩展DynamicObject
的类型,那么您将无法获得属性像这样的“正常”反射。
答案 1 :(得分:7)
在我的情况下ob
没有正确pr
getter setter 。
//causes GetProperty to return null
public class MyClass{
public object pr;
}
//Works
public class MyClass{
public object pr { get; set; }
}
答案 2 :(得分:3)
就我而言,我必须定义get和set。见上面的帖子
public string MyPropertyName { get; set; }
在此之后,我可以通过以下方式获得该物业:
typeof(MyClassItem).GetProperty("PropertyName")
答案 3 :(得分:1)
如果您尝试访问的项目没有getter和setter访问器,则很可能是一个字段。
因此您的代码将按以下方式工作:
FieldInfo fieldInfo = type.GetField(fieldName);
答案 4 :(得分:0)
试试
Type.GetProperty(String, BindingFlags)
重载并选择正确的绑定标志。
答案 5 :(得分:0)
ExpandoObject示例(它实现了IDynamicMetaObjectProvider Jon Skeet提到):
public static string ReturnProperty(object ob, string prop)
{
if (ob is ExpandoObject)
{
return ((ExpandoObject)ob).Single(e => e.Key == prop).Value.ToString();
}
Type type = ob.GetType();
PropertyInfo pr = type.GetProperty(prop);
return pr.GetValue(ob, null).ToString();
}
//--
dynamic dyna = new ExpandoObject();
dyna.Name = "Element";
Console.WriteLine(ReturnProperty(dyna, "Name"));
答案 6 :(得分:-1)
我试过这个&它奏效了。
public string ReturnProperty(object ob, string prop)
{
Type type = ob.GetType();
PropertyInfo pr = type.GetProperty(prop);
//Here pr is null..Dont know whats wrong
return pr.GetValue(ob, null).ToString();
}
ReturnProperty(new { abc = 10 }, "abc");
什么不对???
答案 7 :(得分:-1)
当我在MVC项目中传递排序网格视图的错误数据时,我刚遇到此问题。
public HolidaysGridViewModel()
{
this.Sort = "HolidayDate"; // this was the wrong name
this.SortDir = "ASC";
}
在阅读完您的问题之后,我意识到您最有可能从数据库中传递企业名称而不是数据库列对象的名称,因此没有找到可能导致您的原因的结果空值。