【问题标题】:.NET Get private property via Reflection.NET 通过反射获取私有属性
【发布时间】:2012-01-23 19:57:16
【问题描述】:

我有以下场景

组装A

public abstract class MyBaseEntity        
{   
    //Uncompleted method     
    public void addChild<T>(T child)
    {            

        try
        {                
            Type tInfo = this.GetType();
            PropertyInfo pInfo = tInfo.GetProperties(BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance).Where(p => p.PropertyType == typeof(ISet<T>)).FirstOrDefault();                
            MethodInfo mInfo = tInfo.GetMethod("Add");
            mInfo.Invoke(this, new object[] {child});
        }
        catch (Exception ex)
        {               
            throw ex;
        }
    }

}

大会B

 public class MyModel : MyBaseEntity
{
    public virtual int p1 { get; set; }
    public virtual int p2 { get; set; }
    public virtual DateTime p3 { get; set; }
    public virtual bool p4 { get; set; }
    private readonly ISet<MyModelChild> _p5;
    private readonly ISet<MyModelChild2> _p6;
    public virtual string p7 { get; set; }

    public MyModel()
    {
        this._p5 = new HashSet<MyModelChild>();
        this._p6 = new HashSet<MyModelChild2>();
    }

    public virtual IEnumerable<MyModelChild> P5
    {
        get { return _p5; }
    }

    public virtual IEnumerable<MyModelChild2> P6
    {
        get { return _p6; }
    }
}    

在 MyBaseEntity 类中,我尝试获取私有 ISet 子级并调用方法“Add”。 我把“addChild”方法称为

myObject.addChild<MyModelChild>(child);

GetProperties 方法不会提取私有属性。它可以提取所有公共属性,但不能提取私有属性。

谁能帮帮我?

谢谢!

【问题讨论】:

  • 我认为您的程序集 A 代码中有错字(您没有对 pInfo 执行任何操作)。我还想知道,如果您要在其中进行反射而不是仅仅在继承类中覆盖它,那么将 AddChild 设为虚拟有什么意义。
  • @Malcom O'Hare 你是对的!我将该方法评论为“未完成”并删除了虚拟

标签: c# .net reflection properties


【解决方案1】:

你提到的两个private是字段,而不是属性,你自然不会用GetProperties找到它们(你可以使用GetFields)。

【讨论】:

  • 我也尝试过 GetFields(BindingFlags.NonPublic) 但它也不起作用
  • 我再次尝试使用 GetFields(BindingFlags.Instance) 现在可以正常工作了!谢谢!
猜你喜欢
  • 2011-10-06
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 2012-03-02
相关资源
最近更新 更多