C#神奇的DeclaringType

这两天遇到个好玩的东西,过程是这样的:

有这样的两个类,它们都被封装到同一个dll中。

public abstract class MyClass
{
    public int MyProperty
    {
        get;
        private set;
    }
}

public class MyChildClass : MyClass
{
    public int MyProperty2
    {
        get;
        private set;
    }
}

MyChildClass继承自MyClass

MyClass里面有个MyProperty属性是public的

但是里面set方法是private的。

        MyChildClass obj = new MyChildClass();
        Type type = obj.GetType();
        PropertyInfo property = type.GetProperty("MyProperty");
        MethodInfo setMethod = property.GetSetMethod(true);
        setMethod.Invoke(obj, new object[] { 42 });

        Console.WriteLine(property.GetValue(obj)); // 输出 42

目的是:通过实例化的MyChildClass获取父类里面的MyProperty里面的set方法进行赋值的操作。

但是这样执行后发现setMethod一直是空的。

找了好多方法也反射不出来父类的公共属性的set方法。

后来找API发现了个MemberInfo里面有个DeclaringType,这个就可以解决上述问题。

        MyChildClass obj = new MyChildClass();
        Type type = obj.GetType();
        PropertyInfo property = type.GetProperty("MyProperty").DeclaringType.GetProperty("MyProperty");
        MethodInfo setMethod = property.GetSetMethod(true);
        setMethod.Invoke(obj, new object[] { 42 });

        Console.WriteLine(property.GetValue(obj)); // 输出 42

只需这样写就好了

PropertyInfo property = type.GetProperty("MyProperty").DeclaringType.GetProperty("MyProperty");

 

 用这个就可以找到声明该属性的父类对象了。

就这样

拜拜~

 

posted @ 2023-05-05 14:37  有只小耗子  阅读(110)  评论(0编辑  收藏  举报