通过Reflection从动态中检索属性信息

时间:2012-12-10 11:16:49

标签: c# wpf .net-4.0

ADDED:我想做什么。我有一些东西,比如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";

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

1 个答案:

答案 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();