【问题标题】:Retrieve property info from dynamic by Reflection通过反射从动态中检索属性信息
【发布时间】:2012-12-10 11:16:48
【问题描述】:

添加:我想做什么。我有一些东西,例如 DataReader,我想从中创建 IEnumerable 的对象,其成员与 DataReader 中一样。因此,在设计和编译时,我不知道动态对象中有多少属性(取决于 DataReader 中包含多少列)及其名称。而且我需要创建具有正确名称和值的属性的此类动态匿名对象,以便将来通过反射获得此属性...

我想到了 DynamicObject,这就是我所做的:

我有 DynamicObject 类:

using System.Collections.Generic;
using System.Dynamic;
using System.Linq;

namespace makarov.ReportManager.InternalLogic
{
public class DataReaderParcer : DynamicObject
{
    private readonly Dictionary<string, object> m_properties;

    public DataReaderParcer()
    {
        m_properties = new Dictionary<string, object>();
    }

    public bool SetMember(string name, object value)
    {
        if (m_properties.ContainsKey(name))
            m_properties.Remove(name);
        m_properties.Add(name, value);
        return true;
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        return SetMember(binder.Name, value);
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = null;
        if (m_properties.ContainsKey(binder.Name))
            result = m_properties[binder.Name];
        return m_properties.ContainsKey(binder.Name);
    }

    public override IEnumerable<string> GetDynamicMemberNames()
    {
        return from p in m_properties select p.Key;
    }
}

}

这是用法:

   dynamic dd = new DataReaderParcer();
        dd.MyMember= 3;
        dd.YourMember= "hello";

如何在另一种方法中使用反射检索此对象的 PropertyInfo[]?像 dd.GetType().GetProperties() 这样的东西不能正常工作,因为 DataReaderParcer 没有任何属性。

【问题讨论】:

  • 由于没有属性,你想在你的 ProperyInfo[] 中得到什么?
  • 旁注,Parcer - 你是说 Parser 吗?
  • 是的,解析器。我想获取我的动态属性...
  • 你为什么不用var members = (dd.GetDynamicMemberNames() as IEnumerable&lt;string&gt;).ToList();

标签: c# wpf .net-4.0


【解决方案1】:

您是从 DynamicObject 派生的,因此您可以调用 GetDynamicMemberNames 来获取您的成员的枚举。

http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.getdynamicmembernames.aspx

dynamic dd = new DataReaderParcer();
IEnumerable<string> members = dd.GetDynamicMemberNames();

【讨论】:

  • 是的,我什至重写了这个方法。但问题是我不知道它是普通对象还是动态,但是是的,我可以在“if”语句中解决它,但我不喜欢这个想法。但接下来我需要获取属性的值,我将在 GetDynamicMemberNames 方法中获取...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 2010-09-17
  • 2013-07-18
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
相关资源
最近更新 更多