1

追記:やりたいこと。たとえば、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 にはプロパティがないため、このようなものは正しく機能しません。

4

1 に答える 1

2

DynamicObject から派生しているため、GetDynamicMemberNames を呼び出してメンバーの列挙を取得できます。

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

dynamic dd = new DataReaderParcer();
IEnumerable<string> members = dd.GetDynamicMemberNames();
于 2012-12-10T11:27:31.070 に答える