通过字符串获取动态属性值

本文关键字:属性 动态 获取 字符串 | 更新日期: 2023-09-27 18:24:51

我有一个从WebMatrix.Data生成的动态对象:

dynamic obj;  [WebMatrix.Data.DynamicRecord]

所以做这样的事情很好:

int ID = obj.ID;

但是,尝试通过如下所示的字符串访问该属性:

obj.GetType().GetProperty("ID").GetValue(obj, null);

我收到以下错误:Cannot perform runtime binding on a null reference

我假设WebMatrix.Data.DynamicRecord类型与dynamic类型不同?但它被宣布为dynamic.

以下内容确实返回具有整个值数组的WebMatrix.Data.DynamicRecord类型:

obj.GetType();

但是,以下内容返回值为 nulldynamic类型:

obj.GetType().GetProperty("ID");

我猜这就是错误的原因,但是为什么当obj.ID不返回null时它为空?

如何通过字符串获取属性?

通过字符串获取动态属性值

我猜这就是错误的原因,但是为什么当 obj.ID 不返回 null 时它是空的?

GetProperty()将查找该类型的 CLR 属性。动态属性访问并不总是这样工作的 - DynamicRecord派生自DynamicObject,我怀疑它覆盖了用于属性访问(除其他外(的TryGetMember方法。所以基本上,这是一个只能动态可用的属性。

如果你知道obj永远是一个DynamicObject,你可以随时投靠它并自己打电话给TryGetMember......尽管您必须创建自己的GetMemberBinder。这有点尴尬,但看起来唯一的抽象成员是FallbackGetMember,所以你只需要弄清楚如何实现它。