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