c# - 通过反射从动态中检索属性信息

标签 c# wpf .net-4.0

添加:我想做的事情。我有一些东西,例如 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 没有任何属性。

最佳答案

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

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

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

关于c# - 通过反射从动态中检索属性信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13799891/

相关文章:

wpf - 如何以编程方式将选项卡项添加到 prism 中的选项卡控件

c# - 最小起订量是触发代码契约(Contract)?

c# - 使用 Task.Factory.StartNew 新创建的线程启动非常慢

c# - 从 EventLog.CreateEventSource 接收 "...has already been registered..."即使我正在检查 !EventLog.SourceExists

c# - 是否可以将 OrderBy 表达式作为参数传递?

c# - 如何禁用 ASP.NET 成员身份提供程序的帐户?

c# - 用正在呈现的控件完全替换 ItemsControl ContentPresenter

wpf - 使用 WPF 更改 FontSize 与窗口大小的关系?

c# - 为什么我的 C# Remoting 对象超时,即使 Lifetime 返回 null?

c# - 对反斜杠分割感到困惑